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

时间:2015-03-03 16:24:33

标签: java mockito

我正在学习mockito,我从link了解上述功能的基本用法。

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

5 个答案:

答案 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)

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

  • 如果您不使用doNothing而模拟对象,则不会调用真实方法
  • 如果您不使用doNothing而间谍某个对象,则称为真正的方法

换句话说,通过模拟,与协作者的唯一有用的交互是您提供的。默认情况下,函数将返回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是完美的。