【问题标题】:Mockito returning same argument of ArrayList which is passedMockito 返回与传递的 ArrayList 相同的参数
【发布时间】:2021-07-28 10:19:02
【问题描述】:

我有一个方法用作:

 List<Integer> permittedUserIds= this.getAuthorizationManager()
                    .getPermittedUserIDs(Constants.Permissions.Target.COMMON_DATA, Constants.Permissions.Action.READ,
                            userIdList);

后面的 mocking 方法如下:

选项 1:

Mockito.when(spied.getPermittedUserIDs(Mockito.anyString(),Mockito.anyString(),Mockito.anyList())).thenAnswer(i -> i.getArguments()[2]);

这甚至行不通,因为我认为只需要执行 doReturn,thenAnswer 在这里不起作用。

选项 2:

Mockito.doReturn(AdditionalAnswers.returnsLastArg())
                    .when(spied)
                    .getPermittedUserIDs(Mockito.anyString(), Mockito.anyString(), 
                     Mockito.anyList()); 

获取运行时异常为:

错误! java.lang.RuntimeException: org.mockito.exceptions.misusing.WrongTypeOfReturnValue: ReturnsArgumentAt 不能由 getPermittedUserIDs() 返回 getPermittedUserIDs() 应该返回 List

如果您不确定为什么会出现上述错误,请继续阅读。因为 可能会出现上述语法问题的性质,因为:

  1. 此异常可能发生在错误编写的多线程测试中。请参阅 Mockito 常见问题解答以了解并发限制 测试。
  2. 使用 when(spy.foo()).then() 语法对间谍进行存根。存根间谍更安全-
    • 使用 doReturn|Throw() 系列方法。更多关于 Mockito.spy() 方法的 javadocs。

请建议如何模拟它。这个想法是返回作为最后一个参数传入的相同数组列表。

【问题讨论】:

  • this.getAuthorizationManager() 会返回你的模拟吗?

标签: java mockito


【解决方案1】:

使用doAnswer 而不是doReturn

示例如下:

public class AppTest {

    @Test
    void test() {
        Service service = Mockito.mock(Service.class);
        List<Integer> userIdList = Arrays.asList(3,4);

        Mockito.doAnswer(AdditionalAnswers.returnsLastArg())
                .when(service)
                .getPermittedUserIDs(Mockito.anyString(), Mockito.anyString(),
                        Mockito.anyList());

        List<Integer> permittedUserIds= service
                .getPermittedUserIDs("1", "2",
                        userIdList);

        Assertions.assertSame(userIdList,permittedUserIds);
    }

    public interface Service {
        List<Integer> getPermittedUserIDs(String a, String b, List<Integer> userIdList);
    }
}

【讨论】:

  • 即使尝试使用 doreturn 也无法正常工作,你能分享代码 sn-p 你在说什么吗?
  • @Scientist 我添加了示例。
猜你喜欢
  • 2014-11-27
  • 2019-12-09
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
相关资源
最近更新 更多