1

我有一个 EJB,我想对它的公共方法进行单元测试。我正在测试 EJB 作为 pojo。所以我只是实例化了它并调用了公共方法。

问题是公共方法设置了一些 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

4 回答 4

2

您始终可以访问,甚至可以访问私有方法。在您的测试中使用反射来访问私有属性 - 设置它们并继续使用它。

于 2012-07-14T01:18:56.080 回答
2

在单元测试时添加一个 setternameServiceEnvironment并注入你自己的。nameServiceEnvironment

根据评论更新

或者,您可以将 setup 中的属性位提取到另一个方法中,并在测试中覆盖它以伪造。

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

嗯,不完全是假的。您只需在测试中绕过这一位。

于 2012-07-14T01:23:52.237 回答
1

您的 nameServiceEnvironment 使用设置

@Resource(name="NameServiceEnvironment")

所以您只需要确保您的测试环境配置了该资源(就像在 Glassfish 环境中一样)。例如,您可以使用 Spring。

于 2012-07-14T01:23:32.373 回答
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);
    }
}

}

于 2012-07-14T01:26:03.003 回答