Java Mockito-返回传递给方法的相同对象

Java Mockito-返回传递给方法的相同对象,java,mockito,Java,Mockito,假设我在某个服务类中有以下方法: public SomeEntity makeSthWithEntity(someArgs){ SomeEntity entity = new SomeEntity(); /** * here goes some logic concerning the entity */ return repository.merge(entity); } 我想测试此方法的行为,因此希望以以下方式模拟存储库。合并: when(rep

假设我在某个服务类中有以下方法:

public SomeEntity makeSthWithEntity(someArgs){
    SomeEntity entity = new SomeEntity();
    /**
     * here goes some logic concerning the entity
     */
    return repository.merge(entity);
}
我想测试此方法的行为,因此希望以以下方式模拟
存储库。合并

when(repository.merge(any(SomeEntity.class))).thenReturn(objectPassedAsArgument);
然后mocked repository返回传递给它的
makesswhithentity
,我可以很容易地测试它


有什么办法可以强制mockito返回
objectpassedaargument

您可以实现
应答
,然后使用
然后应答()

类似于:

when(mock.someMethod(anyString())).thenAnswer(new Answer() {
    public Object answer(InvocationOnMock invocation) {
        return invocation.getArguments()[0];
    }
});

当然,一旦你有了这个答案,你就可以将答案重构成一个可重用的答案,叫做
ReturnFirstArgument
或类似的答案。

或者更好地使用mockito附带的答案

when(mock.something()).then(AdditionalAnswers.returnsFirstArg())

其中,
AdditionalAnswers.returnsFirstArg()
可以静态导入。

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

when(mock.something(anyString())).thenAnswer(i -> i.getArguments()[0]);

你的意思是当(repository.merge(any(SomeEntity.class)),然后返回(entity)?mockito中已存在:
addationalAnswers.returnsFirstArgs()
您仍然可以使用
thenAnswer(i->i.getArguments()[0])
缩短代码。很好的解决方案,顺便说一句,
addationalanswers.returnsFirstArg()
给了我一些错误。很好,这给了我机会的海洋。谢谢你!我没想到这会很常见,可以内置,更不用说“returnsSecondArg”等等。我还喜欢在这里使用
then()
别名,因为它读起来更好。是的;)我们引入了
then
alias,以便在与静态工厂方法结合使用时更好地阅读自定义答案。@MarkPeters,
AdditionalAnswers
用于“不太常见的答案”,它在documentation@smac89但是很普通;)