首页 > 解决方案 > 如何模拟依赖于输入值的依赖项?

问题描述

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

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. 我想对整个方法进行单元测试,但我事先不知道依赖关系。可能吗?

标签: javaunit-testingjunitmockito

解决方案


在这种情况下,您传入的是某种抽象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

(请注意,“创建、使用和处置服务对象”是一个非常有问题的设计,除非您坚持使用一些设计不佳的外部库,否则它正在乞求重构。)


推荐阅读