在测试中模拟EJB注入

每当我想测试一个使用资源注入的类时,我最终会包含一个只在测试中使用的构造函数:

public class A { @EJB B b; // Used in tests to inject EJB mock protected A(B b) { this.b = b; } public A() {} // Method that I wish to test public void foo() { b.bar(); } } 

是否存在另一种模拟资源注入的方法,或者这是正确的模式?

你可以使用简单的光泽效果,它嘲笑EJB注入系统。

另一种方法是在测试中使用reflection设置字段,我有时使用这样的东西:

 public static void setPrivateField(Class instanceFieldClass, Object instance, String fieldName, Object fieldValue) throws Exception { Field setId = instanceFieldClass.getDeclaredField(fieldName); setId.setAccessible(true); setId.set(instance, fieldValue); } 

Eliocs,

如果键入B接口,那么你就不会“只是”为测试用例做这样的事情; 你会允许“B的行为”的任何替代实现,即使它/它们的需要尚未被设想。

是的,基本上这是唯一可以遵循的模式(AFAIK)…所以(正确或错误地)你也可以充分利用它;-)

干杯。 基思。

这当然是一种方法,虽然我依赖于包访问; 不提供构造函数注入点,而只是将测试放在与被测试的bean相同的包中。 这样,您的测试可以直接访问该值(假设它不是私有的):

 @Test public void EJBInjectionTest() { A a=new A(); ab=new B() { // mock functionality here, of course... }; assertNotNull(ab); }