如何模拟/测试返回void的方法,可能在Mockito中

时间:2011-06-17 08:00:53

标签: java testing mocking mockito

我遇到了一个问题,我找不到一个优雅的解决方案。

所以问题在于模拟Selenium web驱动程序,我不知道应该如何测试/模拟void方法。

public void clickAndWait(String locator) {
    if(isElementPresent(locator) == false) throw some exception;
    selenium.clickAndWait(); //a problematic delegating call to selenium
}

所以我要问的是,如何正确测试这样一个方法,一个测试是抛出异常,但是如何正确地测试我委托的那个void方法?

6 个答案:

答案 0 :(得分:31)

Mockito documentation中的以下代码示例说明了如何模拟void方法:

doThrow(new RuntimeException()).when(mockedList).clear();

// following throws RuntimeException:
mockedList.clear();

答案 1 :(得分:21)

doAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {

            return null;
        }
    }).when(mock).method((SomeClass) anyObject());

答案 2 :(得分:10)

以前的答案一直强调在每次通话时做某事(可能抛出异常)。这样做的时候会这样:

doThrow(new RuntimeException()).when(mockedList).clear();

然后调用存根服务(或逻辑),如:

mockedList.clear();

它会产生异常。如果你想测试方法的正确功能怎么办可能会写出积极的测试用例。对这种情况进行虚空返回的方法可以通过以下方式完成:

doNothing().when(mockedList).clear();

这意味着,因为你为clear()模拟了mockedList方法,你可以确定这个方法不会影响单元的逻辑,你仍然可以检查其余的流动而不产生例外。

答案 3 :(得分:1)

您也可以使用:

  • 方法Mockito.verify(mock / spy)检查方法被调用的次数。
  • 或使用argument captor查看/检查传递给void方法的一些参数。

答案 4 :(得分:0)

您可以在方法调用上抛出异常,这是一个小例子:

doThrow(new RuntimeException()).when(mockedList).clear();

然后你调用mockedList.clear(); mocked方法会抛出异常。

或者您可以计算调用方法的次数,这里有一个小例子:

verify(mockedList, times(1)).clear(); 

答案 5 :(得分:0)

在Java 8中,这可以更清晰一些

doAnswer((i) -> {
  // Do stuff with i.getArguments() here
  return null;
}).when(*mock*).*method*(*methodArguments*);

return null;很重要,如果没有它,编译将失败并出现一些相当模糊的错误,因为它无法为doAnswer找到合适的覆盖。