Java 如何在Mockito中模拟/测试返回void的方法
我遇到了一个问题,我找不到一个优雅的解决方案 所以问题在于模拟Selenium web驱动程序,我不知道应该如何测试/模拟void方法Java 如何在Mockito中模拟/测试返回void的方法,java,testing,mocking,mockito,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 }
public void clickAndWait(String locator) {
if(isElementPresent(locator) == false) throw some exception;
selenium.clickAndWait(); //a problematic delegating call to selenium
}
所以我要问的是,如何正确地测试这样一个方法,一个测试是针对抛出的异常,但是如何正确地对我委托的void方法进行测试?下面的代码示例演示了如何模拟void方法:
doThrow(new RuntimeException()).when(mockedList).clear();
// following throws RuntimeException:
mockedList.clear();
doAnswer(新答案(){
@凌驾
公共Void应答(invocationmock调用)抛出可丢弃的{
返回null;
}
}).when(mock).method((SomeClass)anyObject());
您还可以使用:
- 方法Mockito.verify(mock/spy)检查调用该方法的次数
- 或者使用查看/检查传递给void方法的某些参数
doThrow(new RuntimeException()).when(mockedList).clear();
然后调用mockedList.clear()代码>模拟方法将引发异常
或者您可以计算方法被调用的次数,下面是一个小示例:
verify(mockedList, times(1)).clear();
前面的答案强调在每次通话中都要做些什么(可能抛出异常)。这样,当您执行以下操作时:
doThrow(new RuntimeException()).when(mockedList).clear();
然后调用存根服务(或逻辑),如:
它将生成一个异常。如果您想测试方法的正确功能,可能需要编写积极的测试用例。模拟这种情况下的无效返回方法可以通过以下方式完成:
doNothing().when(mockedList).clear();
这意味着,由于您为mockedList
mock stub了clear()
方法,因此可以确保此方法不会影响单元的逻辑,并且仍然可以检查流的其余部分,而不会生成异常。在Java 8中,这可以变得更干净一些
doAnswer((i) -> {
// Do stuff with i.getArguments() here
return null;
}).when(*mock*).*method*(*methodArguments*);
返回null
非常重要,如果没有它,编译将失败,并出现一些相当模糊的错误,因为出于好奇,它无法为doAnswer
找到合适的覆盖,为什么要为集成测试编写单元测试?可能是+1有用答案的重复,该答案显示了当方法采用参数时如何使用doThrow/doAnswer/etc,即使用anyObject()
进行转换。嗨,Marcin,我试着给出了相同的答案,并得到了中提到的错误。你能看一下吗?嗨,Sourabh,我尝试了相同的解决方案,得到了中提到的异常,您能看一下吗?Mockito文档链接现在不可用:(
doNothing().when(mockedList).clear();
doAnswer((i) -> {
// Do stuff with i.getArguments() here
return null;
}).when(*mock*).*method*(*methodArguments*);