首页 > 解决方案 > Mockito 返回与传递的 ArrayList 相同的参数

问题描述

我有一个方法用作:

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

模仿的方法如下:

选项1 :

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

这甚至不起作用,因为我认为只需要使用 doReturn ,然后Answer 在这里不起作用。

选项 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。

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

标签: javamockito

解决方案


使用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);
    }
}

推荐阅读