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和单元测试很新,不知道如何解决这个问题。任何指导都将不胜感激。
答案 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);