Проблема, с которой вы сталкиваетесь, заключается в том, что поле static
поля class
инициализируется только один раз. Следовательно, первый тест создает новый объект Bar
, но этот макет сохраняется во всех остальных тестах, так как новое создание не запускается.
Вместо этого следует использовать Reflections
, чтобы установить поле private static
для каждого теста , PowerMock
предоставляет вам служебный класс с именем Whitebox
.
Также обратите внимание, что setInternalState
работает только в том случае, если в этом классе есть ровно один экземпляр объекта Bar
. Вы должны полагаться на обычные Java классы отражения, если их будет несколько.
Пример см. Ниже:
@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor("test.Foo") // optional, only required if the Bar class could not be created normally.
public class StaticTest {
@Test
public void somethingTest() throws Exception {
Bar barMock = createMock(Bar.class);
Whitebox.setInternalState(Foo.class, barMock);
expect(barMock.doSomething(1, "xxx")).andReturn("ABC");
replay(barMock, Bar.class);
Foo.start(1, 2, "xxx");
verify(barMock, Bar.class);
}
@Test
public void somethingElseTest() throws Exception {
Bar barMock = createMock(Bar.class);
Whitebox.setInternalState(Foo.class, barMock);
expect(barMock.doSomethingElse(0, 2,"xxx")).andReturn("ABC");
replay(barMock, Bar.class);
Foo.start(0, 2, "xxx");
verify(barMock, Bar.class);
}
}
Я объединил это с подавлением состояния c инициализация, но строго говоря, это не обязательно для вашего теста, так как создание класса Bar
завершается успешно независимо.
Аннотация должна использоваться только в случае, если класс Bar
не может быть создан. Обратите внимание, что вам нужно будет ввести полностью квалифицированное имя, включая имя пакета (я предположил, что пакет будет test
).