【发布时间】: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
如果您不确定为什么会出现上述错误,请继续阅读。因为 可能会出现上述语法问题的性质,因为:
- 此异常可能发生在错误编写的多线程测试中。请参阅 Mockito 常见问题解答以了解并发限制 测试。
- 使用 when(spy.foo()).then() 语法对间谍进行存根。存根间谍更安全-
- 使用 doReturn|Throw() 系列方法。更多关于 Mockito.spy() 方法的 javadocs。
请建议如何模拟它。这个想法是返回作为最后一个参数传入的相同数组列表。
【问题讨论】:
-
this.getAuthorizationManager()会返回你的模拟吗?