doThrow()doAnswer()doNothing()和doReturn()在mockito中的用法



我在学习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就是完美的。

相关内容

  • 没有找到相关文章