如何模拟依赖于输入值的依赖关系



我想对这样的方法进行单元测试:

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>

由于CCD_ 6可能是唯一的";活的";实现这个类,你甚至可以做这样的事情:

class MyService {
@Setter
private BiFunction<String, String, SDKClient> createClient = SDKClient::new;
...
}

当依赖于系统java.time.Clock时,通常可以看到这种模式。

(请注意,"创建、使用和处置服务对象"是一个非常有问题的设计,除非你不得不使用一些设计糟糕的外部库,否则它需要重构。(

最新更新