如何为具有topComponents成员变量的类编写junit测试?

时间:2013-07-08 16:09:39

标签: java netbeans junit

public class Something {

private static Something something = new  Something();

public static Something get(){
    return something;
}

private EventQueueWindow eventQueue;

private Something(){
    TopComponent tc = WindowManager.getDefault().findTopComponent("EventQueueWindow");
    eventQueue = (EventQueueWindow) tc;
}

EventQueue getQueue(){
    return eventQueue;
}

}//end class Something

现在我想写一个JUnit测试,它需要能够访问eventQueue。

public void testgetQueue() {
    Something something = Something.get();
    assertEquals("Failed to return EventQueueWindow",something.getQueue().getClass(), EventQueueWindow.class);
}

我在运行测试时得到java.lang.NullPointerException,因为eventQueue的{​​{1}}值为null,尽管它在类Something's构造函数中被赋值。我已经读过,这可能与在不同线程中处理的组件有关,或者在测试运行之前没有被初始化。但我对java和单元测试很新,不知道如何解决这个问题。任何指导都将不胜感激。

2 个答案:

答案 0 :(得分:1)

你最大的问题是你有全球状态。全局状态通常是糟糕的编程,包括测试。

测试特定的实现类,可能不是一个非常好的测试。

我建议删除你的全局状态并依赖于你从库中找到的全局状态,然后测试它。

答案 1 :(得分:0)

我相信正在发生的事情是该类被设计为存在于大型上下文中。 WindowManager为类提供对该上下文的访问权限,但单元测试中不存在上下文,因此管理器返回null。

一种解决方案是使用构造函数的两个重载,其中一个以WindowManger作为参数。然后在测试中将模拟WindowManager传递给此构造函数。

通过Mockito模拟示例:

 WindowManager man = Mockito.mock(WindowManager.class);
 EventQueueWindow window = Mockito.mock(EventQueueWindow.class);
 Mockito.when(man.findTopComponent("EventQueueWindow")).thenReturn(window);