模拟Swing静态方法时的java.lang.VerifyError

我正在使用PowerMock来模拟JOptionPane上的静态方法,但是JRE似乎并不是非常符合它,因为我在初始化时得到了一个
java.lang.VerifyError,因为它检查了自己的包和类的完整性.

我有一些解决方法,但我对它们中的任何一个都不满意:

>为JOptionPane编写一个对象包装器,并为我需要的方法(showInputDialog等)提供一个接口,这样我就可以注入一个mock或stub来进行测试.这只是将问题移到别处,因为我仍然需要覆盖我的包装器方法,但至少它们将与逻辑隔离.
>使用JOptionPane的实例代替类引用来调用它上面的方法(我认为我不会在模拟实例时遇到任何问题,因为类不是最终的).缺点是我会收到很多关于“在实例变量上调用静态方法”的警告,但这是付出的代价.
>根本不要模拟JOptionPane并使用Robot来触发输入事件来处理它.这可能非常麻烦而且不够健壮……除此之外,我正在使用内部对话框,这需要额外的工作来设置JDesktopPane,JInternalFrames等.

还有其他想法或建议吗?

谢谢!

更新:通过te方式,我已经尝试模拟JOptionPane实例,似乎方法调度程序忽略实例直接选择以前存在的静态方法(毕竟这是有意义的),因此第二个选项被丢弃.

最佳答案 >为JOptionPane编写一个包装器 – 这绝对是最强大的选项,并且还允许您为自己编写方便的简写方法.我会选这个.如果像我和大多数其他开发人员一样,你已经在项目的某个地方拥有了一些GUI助手类,他们可以去那里.

>使用实例 – 这不是一个糟糕的解决方案,但绝对不像调用单个静态方法那样易于管理.我不会说增加的复杂性是值得的.

>使用机器人模拟输入 – 是的,这听起来非常脆弱.在那时你变得依赖于JOptionPane的内部结构和实现细节,这不是一个好地方. JOptionPanes的行为和按钮顺序也可能在不同的外观和感觉下变化(即OK,Cancel vs. Cancel,OK).最后,这将无法在无头环境中工作(尽管如果您已经在测试中使用JOptionPanes,并计划始终在台式机上进行测试,那么这不是一个问题).

点赞