【发布时间】:2012-06-27 19:15:41
【问题描述】:
当我尝试对 JDialog 对象中的某些方法进行单元测试时,我得到了 NullPointerException。我必须初始化对话框父级的模拟版本以及将使用的另一个类(除了调用静态方法。代码如下:
@RunWith( PowerMockRunner.class )
@PrepareForTest( ControlFileUtilities.class )
public class StructCompDlgTest
{
@Before
public void setUp() throws Exception
{
controlFrame = org.mockito.Mockito.mock( ControlFrame.class );
structCmpDlg = new StructureCompareDialog( controlFrame );
serverPipeline = org.mockito.Mockito.mock( ServerPipeline.class );
}
...
}
构造对话框调用的代码在这里:
StructureCompareDialog( IControlFrame controlFrame )
{
super( (Frame) controlFrame, "title", true );
...
}
当调用超级构造函数时,我最终会在 java.awt.Window.addOwnerWindow(Window.java:2525)" 处得到 NullPointerError"
void addOwnedWindow(WeakReference weakWindow) {
if (weakWindow != null) {
synchronized(ownedWindowList) { ***<<------ offending line***
// this if statement should really be an assert, but we don't
// have asserts...
if (!ownedWindowList.contains(weakWindow)) {
ownedWindowList.addElement(weakWindow);
}
}
}
}
我知道我正在将静态和摇摆 gui 混合在一个有毒的漩涡中,但我别无选择。我被指示将一些单元测试与现有代码组合在一起。我不知道出了什么问题。
谢谢
【问题讨论】:
-
你有没有得到这个工作?如果是这样,您介意发布解决方案吗?
-
Starnge 你在
synchronized(ownedWindowList)得到空指针。如果您检查 Window.java 中的ownedWindowList数据成员,它已经被实例化并且再也没有分配给 null。想知道什么可能使这个数据成员为空。如果此数据成员被访问(使用反射)并且已更改为 null,您能否签入您的代码。最不可能的情况是需要手动更改此数据成员,但最好确保。 -
@glenneroo,我认为在这里放赏金而不是用自己的代码创建新问题是一个错误。您能否提供一些详细信息,例如您所做的事情以及您获得的异常堆栈跟踪。
-
@SergGr,您可能是对的,我的配置稍有不同(没有 PowerMockRunner),但异常和位置相同。堆栈跟踪似乎不是很有帮助,但我会创建另一个问题并希望它不会被标记为重复。
-
@glenneroo,实际上添加指向此问题的链接并提及您仍然没有解决问题的方法可能很有用。
标签: swing junit nullpointerexception mockito powermock