使用私有环境变量对类进行单元测试

时间:2012-07-14 01:10:11

标签: java junit glassfish environment-variables

我有一个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方法。

感谢。

4 个答案:

答案 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);
    }
}

}