如何模拟注入链中的类?例如,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
的关注点