Mockito - 返回与传入方法相同的对象

Lec*_*chP 34 java mockito

让我们假设我在某些服务类中有以下方法:

public SomeEntity makeSthWithEntity(someArgs){
    SomeEntity entity = new SomeEntity();
    /**
     * here goes some logic concerning the entity
     */
    return repository.merge(entity);
}
Run Code Online (Sandbox Code Playgroud)

我想测试这个方法的行为,因此想以repository.merge下面的方式模拟:

when(repository.merge(any(SomeEntity.class))).thenReturn(objectPassedAsArgument);
Run Code Online (Sandbox Code Playgroud)

然后模拟的存储库返回makesSthWithEntity传递给它的内容,我可以轻松地测试它.

任何想法我怎么能强迫mockito返回objectPassedAsArgument

Bri*_*ice 75

或者更好地使用mockito发送的答案

when(mock.something()).then(AdditionalAnswers.returnsFirstArg())
Run Code Online (Sandbox Code Playgroud)

哪里AdditionalAnswers.returnsFirstArg()可以静态导入.

  • 真好!我没想到内置这种用法很普遍,没关系“ returnsSecondArg”,等等。我也喜欢在这里使用`then()`别名,因为它读起来更好。 (2认同)

Mar*_*ers 33

您可以实现一个Answer,然后使用thenAnswer().

类似的东西:

when(mock.someMethod(anyString())).thenAnswer(new Answer() {
    Object answer(InvocationOnMock invocation) {
        return invocation.getArguments()[0];
    }
});
Run Code Online (Sandbox Code Playgroud)

当然,一旦你有了这个,你就可以将答案重构成一个可重复使用的答案ReturnFirstArgument或者类似的答案.

  • 已经存在于mockito中:`AddtionalAnswers.returnsFirstArg()` (16认同)
  • 您仍然可以使用`thenAnswer(i-> i.getArguments()[0])`缩短代码。很好的解决办法,顺便说一句,`AddionalAnswers.returnsFirstArg()`给了我一些错误。 (2认同)

Fil*_*mat 5

使用 Java 8 lambdas 可以轻松完成:

when(mock.something(anyString())).thenAnswer(i -> i.getArguments()[0]);
Run Code Online (Sandbox Code Playgroud)