【问题标题】:Mock method return with one of parameters模拟方法返回参数之一
【发布时间】:2014-03-23 15:22:51
【问题描述】:

我尝试使用参数之一模拟返回值,以这种方式:

    when( myService.saveMyEntity( TENANT_ID, DEFAULT_USER, Mockito.any( MyEntity.class ) ) ).thenAnswer(
            new Answer<MyEntity>() {
                @Override
                public MyEntity answer(InvocationOnMock invocation) throws Throwable {
                    Object[] args = invocation.getArguments();
                    return (MyEntity) args[2];
                }
            } );

但我收到以下错误:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 参数匹配器的使用无效! 预计 3 个匹配器,1 个记录:

有什么问题?如何正确? 我使用模拟 1.9.5 提前感谢您的帮助。

【问题讨论】:

    标签: java unit-testing junit mockito


    【解决方案1】:

    您必须对saveMyEntity 方法的所有参数使用匹配器,或者不使用匹配器。您必须将其更改为:

    when(myService.saveMyEntity(eq(TENANT_ID), any(User.class), any(MyEntity.class))).thenAnswer(
            new Answer<MyEntity>() {
                @Override
                public MyEntity answer(InvocationOnMock invocation) throws Throwable {
                    Object[] args = invocation.getArguments();
                    return (MyEntity) args[2];
                }
            } );
    

    此外,正如@JBNizet 的评论所述,由于您要从答案中返回最后一个参数,因此您可以使用 AdditionalAnswers.returnsLastArg() 工厂方法:

    when(myService.saveMyEntity(eq(TENANT_ID), any(User.class), any(MyEntity.class))).thenAnswer(AdditionalAnswers.returnsLastArg());
    

    【讨论】:

    • thenAnswer(AdditionalAnswers.returnsLastArg())。为什么不使用eq(TENANT_ID) 而不是anyInt()
    • @JBNizet 哦!我对自己很陌生。不知道那个:)
    • 我也不知道。谢谢大家。
    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2015-10-21
    相关资源
    最近更新 更多