Unittest проверки публичное наблюдаемое поведение , где «публичный» означает через API единиц измерения и «поведение», означающее возвращаемые значения и / или связь с зависимости .
Ваш код имеет скрытую зависимость , вызванную статическим доступом к объекту EventHandler
. Я предполагаю, что ваш EventHandler
класс включает в себя образец Java-синглтона . Это код STUPID , с которого большинство из нас начали.
Вы не должны отказываться от этого плохого дизайна, используя PowerMock .
Лучше было бы передать объект EventHandler
в качестве параметра конструктора в тестируемый код следующим образом:
class MyTestedClass{
private final EventHandler eventHandler;
class MyTestedClass(EventHandler eventHandler){
this.eventHandler=eventHandler;
}
public void handleSomeEvent(String str1, String str2){
MyObject obj1 = new MyObject();
obj1.setParameterA(str1);
obj2.setParameterB(str2);
eventHandler.notify(obj1)
}
}
А затем сделайте ваш EventHandler
нормальным классом, от которого вы можете наследовать. (хотя бы удалите ключевое слово final
из объявления класса).
Тогда вы могли бы использовать обычный Mockito для замены объекта EventHandler
тестовым двойником и проверки связи ваших кодов с этим двойным тестом:
class MyTestedClassTest{
@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
@Mock private EventHandler eventHandler; // ignores the private constructor
class MyTestedClass(EventHandler eventHandler){
this.eventHandler=eventHandler;
}
@Test
public void notifiesEventHandlerWithDTO(String str1, String str2){
new UnderTest(eventHandler).handleSomeEvent("test1","test2");
ArgumentCaptor<MyObject> handlerArg = ArgumentCaptor.forClass(MyObject.class);
verify(eventHandler).notify(handlerArg.capture());
assertThat("parameter A passed to object",
handlerArg.getValue().getParameterA(),
equalTo("test1"));
assertThat("parameter B passed to object",
handlerArg.getValue().getParameterB(),
equalTo("test2"));
}
}