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

2022-08-31 13:36:56

我正在学习mockito,我从链接中了解了上述函数的基本用法。

但我想知道它是否可用于任何其他情况?


答案 1

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 为您提供了 Answer<?>在调用该方法时执行的接口,此接口允许您通过 InvocationOnMock 参数与参数进行交互。此外,答案方法的返回值将是模拟方法的返回值。

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 方法设置为不执行任何操作。请注意,默认情况下,模拟上的 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();
    

答案 2

这取决于您要与之交互的测试替身的类型:

  • 如果你不使用 doNothing 并且你模拟了一个对象,那么 real 方法不会被调用
  • 如果你不使用 doNothing 并且监视一个对象,则真正的方法称为

换句话说,通过嘲笑,与协作者的唯一有用的交互是你提供的交互。默认情况下,函数将返回 null,void 方法不执行任何操作。


推荐