2012-07-14 53 views
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方法。

谢谢。

+0

感谢唐的编辑。 – Sara 2012-07-14 01:46:05

回答

2

你总是可以访问,甚至私人方法。在测试中使用反射来访问私有属性 - 设置它们并继续使用它。

+0

我认为只能通过反射访问私有构造函数而不是私有方法。 – 2012-07-14 02:16:25

+0

错误 - 你可以通过反射访问私人的一切 - 方法,ctors,数据成员,一切。 – duffymo 2012-07-14 02:40:56

+1

http://stackoverflow.com/questions/11483647/how-to-access-private-methods-and-private-data-members-via-reflection – 2012-07-14 12:56:30

1

你nameServiceEnvironment使用

@Resource(name="NameServiceEnvironment") 

所以你只需要确保你的测试环境有资源配置的(因为它在Glassfish的环境一样)设置。例如,你可以使用Spring。

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

嗯,不完全是假的。你在测试中简单地绕过这一点。

+0

这就是我的想法。但是我的经理为了隐私的原因说他不希望发生glassfish环境变量的setter或getter方法。 – Sara 2012-07-14 01:41:06

+1

那么,不知道如何揭露二传手隐私风险。无论如何,我已经更新了我的答案以包含替代方案。 – Liggy 2012-07-14 01:50:48

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

}

+0

是的,我测试了上述。我仍然得到同样的例外。也许是因为我们已经将该私有变量设置为Field,但是在类中是属性类型。我不确定。 – Sara 2012-07-15 00:45:58