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
,因为尽管它在类Something's
构造函数中被分配了一个值,但它eventQueue
有一个null
值。我已经读到这可能与在不同线程中处理或在运行测试之前未初始化的组件有关。但是我对java和单元测试很陌生,不知道如何解决这个问题。任何指导将不胜感激。
你最大的问题是你有全局状态。全局状态通常是糟糕的编程,包括测试。
针对特定实现类进行测试可能不是一个很好的测试。
我建议从库中删除您的全局状态和对全局状态的依赖,然后对其进行测试。
正在发生的事情是,该类被设计为存在于一个大上下文中。 WindowManager
允许类访问该上下文,但该上下文在单元测试中不存在,因此管理器返回 null。
一种解决方案是构造函数的两个重载,其中一个将WindowManger
作为参数。然后在测试中将模拟WindowManager
传递给此构造函数。
通过Mockito的嘲笑示例:
WindowManager man = Mockito.mock(WindowManager.class);
EventQueueWindow window = Mockito.mock(EventQueueWindow.class);
Mockito.when(man.findTopComponent("EventQueueWindow")).thenReturn(window);