java - 如何模拟依赖于输入值的依赖项?
问题描述
我想对这样的方法进行单元测试:
public String handleRequest(Event event) {
for(Message msg : event.getRecords()){
SDKClient client = new SDKClient(msg.getUser(), msg.getPassword());
String output = client.makeAPICall();
return output.toUpperCase();
}
}
}
通常,我们模拟依赖项,例如SDKClient
通过将它们作为参数传入并在 Junit/Mockito 中模拟它们。但是,在这种情况下,我不能只传递它,因为这SDKClient
取决于传入的实际事件。还有一个不确定数量的客户端,一个用于event
. 我想对整个方法进行单元测试,但我事先不知道依赖关系。可能吗?
解决方案
在这种情况下,您传入的是某种抽象new SDKClient
调用的函数:
interface SdkClientProvider {
SDKClient(String user, String password);
}
在这种特殊情况下,您可以根据需要使用BiFunction<String, String, SDKClient>
。
由于new SDKClient
可能是此类的唯一“实时”实现,您甚至可以执行以下操作:
class MyService {
@Setter
private BiFunction<String, String, SDKClient> createClient = SDKClient::new;
...
}
这种模式在依赖于系统时很常见java.time.Clock
。
(请注意,“创建、使用和处置服务对象”是一个非常有问题的设计,除非您坚持使用一些设计不佳的外部库,否则它正在乞求重构。)
推荐阅读
- vue.js - 仅选中一个复选框后,如何禁用复选框选项?
- javascript - 错误:路由未在 Next.js 上完成加载
- php - 雄辩的多态作为轴承模型
- flutter - 如何在颤振中实现从 sqflite 的延迟加载
- java - 指定的初始化脚本“/tmp/ijresolvers.gradle”不存在
- javascript - TypeScript 等效于使用括号和变量(作为字符串来访问对象属性)?
- javascript - 每次运行特定函数类型时运行一个函数
- c++ - 我怎么做才能读取数字,以便计算平均值
- javascript - JMeter WebDriver Sampler 没有用于脚本语言的 javascript
- regex - 如何在 AppleScript 中使用正则表达式?