如何通过顺序调用来测试void函数

时间:2018-06-28 12:40:52

标签: java unit-testing mocking mockito powermockito

如何测试一个不返回值但使用给定参数构造要发送到顺序函数的值的函数?

例如

public void handleSomeEvent(String str1, String str2){
   MyObject obj1 = new MyObject();
   obj1.setParameterA(str1);
   obj2.setParameterB(str2);
   EventHandler.getInstance().notify(obj1)
}

在上面的示例中,我想验证EventHandler.notify是否被包含str1作为parameterAstr2作为parameter2的对象调用。可以使用一些常见的嘲笑frameowrk(即mockito)来做到这一点吗?

3 个答案:

答案 0 :(得分:3)

您可以关注

@RunWith(PowerMockRunner.class)
@PrepareForTest({ EventHandler.class })
public class UnderTestTest {

@Test
public void testLoadUniqueOrNull() throws NKFException {
    PowerMockito.mockStatic(EventHandler.class);

    EventHandler handler = PowerMockito.mock(EventHandler.class);
    PowerMockito.when(EventHandler.getInstance())
            .thenReturn(handler);

    ArgumentCaptor<MyObject> handlerArg = 
    ArgumentCaptor.forClass(MyObject.class);
    PowerMockito.doNothing()
            .when(handler)
            .notify(handlerArg.capture());

    new UnderTest().handleSomeEvent("test");
    Assert.assertEquals(new MyObject("test"), handlerArg.getAllValues()
            .get(0));
}

}


public class UnderTest {
    public void handleSomeEvent(String str1) {
        MyObject obj1 = new MyObject(str1);

        EventHandler.getInstance()
                .notify(obj1);
    }
}


public class MyObject {

    private final String x;

    public MyObject(String x) {
        this.x = x;
    }

    @Override
    public boolean equals(Object obj) {
        return ((MyObject) obj).x == x;
    }
}


public class EventHandler {

    private final static EventHandler e = new EventHandler();

    public static EventHandler getInstance() {
        return e;
    }

    public void notify(MyObject obj) {
        // whatever
    }
}

(请注意,此快速代码是为了演示功能,而不是编码中的最佳做法)

答案 1 :(得分:2)

如果需要验证调用的Parram,请使用Mockito的ArgumentCaptor<T>

请参阅参考资料: https://static.javadoc.io/org.mockito/mockito-core/2.6.9/org/mockito/ArgumentCaptor.html

答案 2 :(得分:0)

Unittest验证公共可观察到的行为,其中“公共”通过API单元表示 ,“行为”表示返回值和/或与依赖项通信

您的代码具有对<{1}对象的静态访问导致的隐藏依赖项。我假设您的EventHandler类包含了 Java singelton模式。这是STUPID code,我们大多数人都从这里开始。

您不应使用 PowerMock 屈服于这种不良设计。

更好的方法是将EventHandler对象作为构造函数参数传递给您的受测代码,如下所示:

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关键字)。

然后,您可以使用普通的Mockito将final对象替换为测试双,并验证代码是否与测试双通信:

EventHandler