Java JUnit framework @BeforeClass и (Power) Mockito для статического метода

У меня есть следующий тестовый класс:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Foo.class)
public class MyTestClass {

  @BeforeClass
  public static void setUpBeforeClass() {
    // class Foo: singleton pattern
    Foo mockFoo = Mockito.mock(Foo.class);
    when(mockFoo.theMethod()).thenReturn(...);
    PowerMockito.mockStatic(Foo.class);
    PowerMockito.when(Foo.getInstance()).thenReturn(mockFoo);
  }

  @Before
  public void setUp() {
  }

  @After
  public void tearDown() {
  }

  @AfterClass
  public static void tearDownAfterClass() {
  }

  // MyClass.myStaticMethod() calls to some point Foo.getInstance().theMethod()

  // when the MyTestClass in executed as JUnit in Eclipse this test passes
  // when this test 
  @Test
  public void test1() {
    MyClass.myStaticMethod(myargs);
  }

  // when the MyTestClass in executed as JUnit in Eclipse this test fails because Foo.getInstance() returns null
  // but this test passes if it is executed standalone (test2() selected and run as JUnit test in Eclipse)
  @Test
  public void test2() {
    MyClass.myStaticMethod(myargs);
  }

  // when the MyTestClass in executed as JUnit in Eclipse this test fails because Foo.getInstance() returns null
  // but this test passes if it is executed standalone  (test3() selected and run as JUnit test in Eclipse)
  @Test
  public void test3() {
    MyClass.myStaticMethod(myargs);
  }
}

Я знаю, что setUpBeforeClass() запускается только один раз перед первым тестом, я знаю, что фреймворк JUnit создает новый экземпляр MyTestClass для каждого запуска теста. Но я не могу понять, почему, когда я выполняю как JUnit, класс проходит только первый тест, в то время как каждый тест проходит, когда я запускаю их как JUnit в автономном режиме. Не могли бы вы сказать мне, почему? Почему насмешка «выживает» только для первого выполненного теста? Если код в setUpBeforeClass() находится не в setUpBeforeClass(), а в setUp(), который выполняется перед каждым тестом, все тесты проходят, когда я запускаю класс как JUnit.


person user3121919    schedule 20.12.2013    source источник
comment
Да, действительно, и это отвечает на мой вопрос! Я немного поискал, прежде чем писать, но не нашел. Спасибо!   -  person user3121919    schedule 20.12.2013