我有一个EJB,我想对其公共方法进行单元测试。我正在测试EJB作为一个pojo。所以我只是实例化它并调用公共方法。
问题是public方法设置了一些glassfish环境属性,环境变量是私有的。所以我无法在类之外设置它,当我只是为环境对象调用该公共方法时,它会抛出nullPointerException。
我要测试的课程,
@Resource(name="NameServiceEnvironment")
private Properties nameServiceEnvironment;
public void setup() {
// Set the environment.
Properties environment = new Properties();
environment.setProperty("name.host", this.nameServiceEnvironment.getProperty(NAME_HOST));
environment.setProperty("name.port", this.nameServiceEnvironment.getProperty(NAME_PORT));
...}
现在,对于nameServiceEnvironment,它会抛出空指针异常。
现在从测试类我刚刚实例化了上面的类并调用了setup方法。
感谢。
答案 0 :(得分:2)
您始终可以访问,甚至可以访问私有方法。在测试中使用反射来访问私有属性 - 设置它们并继续使用它。
答案 1 :(得分:2)
为nameServiceEnvironment
添加一个setter,并在单元测试时注入您自己的nameServiceEnvironment
。
根据评论进行更新
或者,您可以将设置中的属性位提取到另一个方法中,并在测试中覆盖它以进行伪造。
public void setup() {
setupEnvironment();
...
}
void setupEnvironment(){ //you would override this in your unit test
Properties environment = new Properties();
environment.setProperty("name.host", this.nameServiceEnvironment.getProperty(NAME_HOST));
environment.setProperty("name.port", this.nameServiceEnvironment.getProperty(NAME_PORT));
}
嗯,不完全是假的。你只需在测试中绕过这一点。
答案 2 :(得分:1)
您的nameServiceEnvironment使用
设置@Resource(name="NameServiceEnvironment")
因此您只需要确保您的测试环境配置了该资源(就像在Glassfish环境中一样)。例如,您可以使用Spring。
答案 3 :(得分:1)
是不是因为没有注入nameServiceEnvironment?这是Arquillian变得流行的原因之一。我使用它几个月来在一个容器中对ejb进行单元测试,但它不容易使用(至少对我来说)。使用arquillian,您可以完成所有依赖注入,然后执行测试方法。我还使用反射作为另一个建议。根据您使用的DI框架,您可以将其配置为测试以注入它。
反射代码,如果你想这样做:
public class ATest {
@Test
public void testEjb() throws Exception {
MyEJB myEjb = new MyEJB();
Class<? extends MyEJB> cls = myEjb.getClass();
Field field = cls.getDeclaredField("props");
field.setAccessible(true);
field.set(myEjb, new Properties());
myEjb.somePublicMethod();
}
class MyEJB {
private Properties props;
public void somePublicMethod() {
System.out.println("props has: " + props);
}
}
}