如何模拟注入(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/