1
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

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

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

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

4

2 回答 2

1

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

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

我建议从你的库中删除你的全局状态和对全局状态的依赖,然后对其进行测试。

于 2013-07-08T16:13:22.877 回答
0

我相信正在发生的事情是该类被设计为存在于一个大的上下文中。WindowManager使类可以访问该上下文,但该上下文在单元测试中不存在,因此管理器返回 null。

一种解决方案是让构造函数有两个重载,其中一个将 theWindowManger作为参数。然后在测试中将模拟传递WindowManager给这个构造函数。

通过Mockito 模拟示例:

 WindowManager man = Mockito.mock(WindowManager.class);
 EventQueueWindow window = Mockito.mock(EventQueueWindow.class);
 Mockito.when(man.findTopComponent("EventQueueWindow")).thenReturn(window);
于 2013-07-08T16:42:47.393 回答