java - 如何模拟注入(inject)链中的单个注入(inject) - Arquillian

标签 java junit dependency-injection mockito jboss-arquillian

如何模拟注入(inject)链中的类?例如,ServiceA 注入(inject)ServiceB,后者又注入(inject)ServiceC(ServiceA -> ServiceB -> ServiceC)。

在 Arquillian 测试中,我需要测试 ServiceA 和模拟 ServiceC,这在我的注入(inject)链中被调用。

我想要的是(ServiceA -> ServiceB -> Mocked(ServiceC))。

如何使用 Arquillian 做到这一点?

@RunWith(Arquillian.class)
public class ServiceATest {

  @Inject
  private ServiceA serviceA;

  public void shouldTestServiceA() {
    //Mock ServiceC.execute();
    serviceA.execute();
  }

}

public class ServiceA {

  @Inject
  private ServiceB serviceB;

  public void execute() {
    serviceB.execute();
  }

}

public class ServiceB {

  @Inject
  private ServiceC serviceC;

  public void execute() {
    serviceC.execute();
  }

}

//needs to be mocked
public class ServiceC {

  public void execute() {

  }

}

最佳答案

您应该考虑通过构造函数注入(inject)遵循显式依赖原则。

而且,类应该依赖于抽象而不是具体。

ServiceA 已知对 ServiceC 的依赖是一个实现问题和代码味道。

public class ServiceA {

    private ServiceB serviceB;

    public ServiceA(@Inject ServiceB serviceB) {
        this.serviceB = serviceB;
    }

    public void execute() {
        serviceB.execute();
    }
}

public interface ServiceB {
    void execute();
}

public interface ServiceC {
    void execute();
}

现在只需模拟并注入(inject) ServiceB 即可进行测试。

ServiceB 实现的依赖不再是 ServiceA 的关注点

关于java - 如何模拟注入(inject)链中的单个注入(inject) - Arquillian,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49326112/

相关文章:

java - mvn 测试未找到 junit 测试

java - 如何在 Spring 上下文初始化之前模拟 REST 服务器?

c# - Azure Functions 不发布 appsettings.prod.json 文件

java - 来自不同 Maven 模块的 Autowire 类?

java - 在 Java 或 Scala 中解析扁平的、大量属性的 xml 的最快方法

java - 使用 aether-api 列出 sonatype Nexus 的可用版本

java - Mongo java api 忽略嵌套的 or/and 运算符

java - java中如何杀死特定进程

java - 有没有办法在启动 mvn appengine :devserver? 时不运行单元测试

PHP-Laravel 依赖注入(inject) : pass parameters to dependency constructor