Java 什么';模拟JUnit构造函数的最佳方法是什么?

Java 什么';模拟JUnit构造函数的最佳方法是什么?,java,junit,junit4,mockito,powermock,Java,Junit,Junit4,Mockito,Powermock,我有一个需要测试的集成器类,类构造函数实例化了一个服务客户机。由于服务客户机是一个外部依赖项,所以我想测试集成商的个人责任。代码如下所示 public class Integrator { Client client; public Integrator() { client = new RemoteClient(); } public String invokeClient() { .... } } 什么是嘲笑这一点的最佳

我有一个需要测试的集成器类,类构造函数实例化了一个服务客户机。由于服务客户机是一个外部依赖项,所以我想测试集成商的个人责任。代码如下所示

public class Integrator {

    Client client;

    public Integrator() {
      client = new RemoteClient();
    }

    public String invokeClient() {
      ....
    }
}

什么是嘲笑这一点的最佳方式?另外,我需要确保代码覆盖率。

使用依赖项注入,这样您就不会创建客户端:

public Integrator(Client client) {
    //... argument checking omitted
    this.client = client;
}
现在,您的测试可以创建可以直接传入的模拟客户端

您仍然可以保留无参数构造函数:

public Integrator() {
  this(new RemoteClient());
}

积分器和客户机之间的耦合非常紧密,因为依赖项反转已经在上面的一个级别进行了处理。拥有多个级别的依赖项反转并没有什么坏处。另外,听起来你需要稍微松一点的耦合,这样你就可以模拟它了。我将描述这个问题,集成商通过DI接收一个客户机,现在每个客户机都与其服务提供商紧密耦合。所示的示例并不合适,它表明我们正在挑选一个可以使用DI的客户机,但正如所说的,我们首先挑选一个使用DI的客户机,然后挑选一个紧密耦合的客户机中的服务提供商。现在,这里的DI将迫使集成商选择一个客户端,并指定没有意义的服务提供商。这是正确的答案。它根本不会改变
Integrator
类的功能-它只是提供了一种模拟客户机的方法。新的公共构造函数(带有
客户机
参数)不需要在生产中调用,只需要由no-arg构造函数调用即可。是的,肯定可以这样做。但即使我这样做了,默认构造函数的分支也无法覆盖。然而,是的,它将是可测试的。