我正在学习mockito,我从link了解上述功能的基本用法。
但我想知道它是否可用于其他任何案件?
答案 0 :(得分:95)
doThrow :在模拟对象中调用方法时想要抛出异常时使用。
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为您提供了答案界面在调用方法的那一刻执行,该接口允许您通过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 :是最简单的列表,基本上它告诉Mockito在调用模拟对象中的方法时什么也不做。有时用于void返回方法或没有副作用的方法,或者与您正在进行的单元测试无关。
public void updateRequestActionAndApproval(final List<Object1> cmItems);
Mockito.doNothing().when(pagLogService).updateRequestActionAndApproval(
Matchers.any(Object1.class));
答案 1 :(得分:2)
这取决于您想要与之交互的测试双重类型:
换句话说,通过模拟,与协作者的唯一有用的交互是您提供的。默认情况下,函数将返回null,void方法不执行任何操作。
答案 2 :(得分:2)
一个非常简单的示例是,如果您有一个UserService
拥有@Autowired
的jpa resposiroty UserRepository
...
class UserService{
@Autowired
UserRepository userRepository;
...
}
然后在UserService
的测试课程中,您将
...
class TestUserService{
@Mock
UserRepository userRepository;
@InjectMocks
UserService userService;
...
}
@InjectMocks
告诉采用@Mock UserRepository userRespository;
并将其注入userService
的框架,而不是自动连接UserRepository
的真实实例,模拟UserRepository
将被注入userService
。
答案 3 :(得分:1)
要在已接受的答案中加一点...
如果您获得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'
答案 4 :(得分:0)
如果您正在测试逻辑类并且它正在调用一些内部void方法,则doNothing是完美的。