我在学习mockito,从链接中了解了上述函数的基本用法。
但我想知道它是否可以用于其他情况?
doThrow:主要用于在mock对象中调用方法时抛出异常。
public void validateEntity(final Object object){}
Mockito.doThrow(IllegalArgumentException.class)
.when(validationService).validateEntity(Matchers.any(AnyObjectClass.class));
doReturn:当您希望在执行方法时发回返回值时使用。
public Socket getCosmosSocket() throws IOException {}
Mockito.doReturn(cosmosSocket).when(cosmosServiceImpl).getCosmosSocket();
doAnswer:有时您需要对传递给方法的参数执行一些操作,例如,添加一些值、进行一些计算,甚至修改它们。doAnswer会给您答案<gt;在调用该方法时执行的接口,该接口允许您通过InvocationOnMock参数与参数交互。此外,answer方法的返回值将是模拟方法的返回数值。
public ReturnValueObject quickChange(Object1 object);
Mockito.doAnswer(new Answer<ReturnValueObject>() {
@Override
public ReturnValueObject answer(final InvocationOnMock invocation) throws Throwable {
final Object1 originalArgument = (invocation.getArguments())[0];
final ReturnValueObject returnedValue = new ReturnValueObject();
returnedValue.setCost(new Cost());
return returnedValue ;
}
}).when(priceChangeRequestService).quickCharge(Matchers.any(Object1.class));
doNothing:(来自文档)使用doNothing()将void方法设置为不执行任何操作。注意mock上的void方法默认情况下什么都不做!然而,doNothing()在极少数情况下派上用场:
在void方法上存根连续调用:
doNothing(). doThrow(new RuntimeException()) .when(mock).someVoidMethod(); //does nothing the first time: mock.someVoidMethod(); //throws RuntimeException the next time: mock.someVoidMethod();
当你侦察真实的物体,并且你希望void方法什么都不做时:
List list = new LinkedList(); List spy = spy(list); //let's make clear() do nothing doNothing().when(spy).clear(); spy.add("one"); //clear() does nothing, so the list still contains "one" spy.clear();
要在已接受的答案中添加一位。。。
如果得到UnfinishedStubbingException
,请确保在when
闭包之后将方法设置为存根,这与编写Mockito.when
时不同
Mockito.doNothing().when(mock).method() //method is declared after 'when' closes
Mockito.when(mock.method()).thenReturn(something) //method is declared inside 'when'
这取决于您想要与之交互的测试替身类型:
- 如果不使用doNothing,并且mock对象,则不会调用真正的方法
- 如果不使用doNothing,并且监视对象,则实际方法被调用
换句话说,通过嘲讽,与合作者之间唯一有用的互动就是你提供的互动。默认情况下,函数将返回null,void方法不执行任何操作。
一个非常简单的例子是,如果您的UserService
具有@Autowired
jpa resposiroty UserRepository
...
class UserService{
@Autowired
UserRepository userRepository;
...
}
然后在UserService
的测试类中,您将进行
...
class TestUserService{
@Mock
UserRepository userRepository;
@InjectMocks
UserService userService;
...
}
@InjectMocks
告诉采用@Mock UserRepository userRespository;
并将其注入userService
的框架,因此将在userService
中注入UserRepository
的Mock而不是自动布线UserRepository
的实际实例。
如果您正在测试一个逻辑类,并且它正在调用一些内部void方法,那么doNothing就是完美的。