java - 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
如果您不确定为什么会出现上述错误,请继续阅读。由于上述语法的性质,可能会出现上述问题,因为:
- 此异常可能发生在错误编写的多线程测试中。有关并发测试的限制,请参阅 Mockito 常见问题解答。
- 使用 when(spy.foo()).then() 语法对间谍进行存根。存根间谍更安全-
- 使用 doReturn|Throw() 系列方法。更多关于 Mockito.spy() 方法的 javadocs。
请建议它需要如何被嘲笑。这个想法是返回作为最后一个参数传入的相同数组列表。
解决方案
使用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);
}
}
推荐阅读
- sql - Google BigQuery 列中哈希字符串的最佳数据类型是什么?
- java - 在显示进度条的同时将文件从一个目录复制到另一个目录
- python - 熊猫 groupby 只返回什么?
- docker - SSL 证书无法在 Docker 中使用 Nginx 加载
- python - 计算值字典列表python的出现次数
- xcode - 为什么 macOS 应用程序在 Xcode 存档后崩溃?
- python - OSMnx:从 OSM 创建图形时出现 Pyproj 投影错误
- search-engine - Google 可编程搜索引擎:仅搜索 HTTPS 网站
- node.js - 压缩模块不会减少我的 Express js API 发送的响应大小。它正在做相反的事情
- java - 格式化双精度时正确的 printf 语法是什么?