我遇到了一个问题,我找不到一个优雅的解决方案。
所以问题在于模拟Selenium web驱动程序,我不知道应该如何测试/模拟void方法。
public void clickAndWait(String locator) {
if(isElementPresent(locator) == false) throw some exception;
selenium.clickAndWait(); //a problematic delegating call to selenium
}
所以我要问的是,如何正确测试这样一个方法,一个测试是抛出异常,但是如何正确地测试我委托的那个void方法?
答案 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)
您也可以使用:
答案 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
找到合适的覆盖。