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

在Arquillian测试中,我需要测试ServiceA和模拟ServiceC,这在我的注入链中称为。

我想要的是(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() {

  }

}

最佳答案

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

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

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();
}


现在只需要模拟ServiceB并为测试注入它。

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

09-04 02:34