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

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

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

doThrow :在模拟对象中调用方法时想要抛出exception时使用。

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参数与参数进行交互。 此外,answer方法的返回值将是模拟方法的返回值。

 public ReturnValueObject quickChange(Object1 object); Mockito.doAnswer(new Answer() { @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返回方法或没有副作用的方法,或者与您正在进行的unit testing无关。

 public void updateRequestActionAndApproval(final List cmItems); Mockito.doNothing().when(pagLogService).updateRequestActionAndApproval( Matchers.any(Object1.class)); 

这取决于您想要与之交互的测试双重类型:

  • 如果您不使用doNothing并且模拟对象,则不会调用实际方法
  • 如果你不使用doNothing并且你监视一个对象,那么就会调用真正的方法

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

如果您正在测试逻辑类并且它正在调用一些内部void方法,则doNothing是完美的。