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

时间:2011-03-29 10:22:32

标签: java swing static-methods powermock

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

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

  • JOptionPane编写一个对象包装器,并为我需要的方法(showInputDialog等)提供一个接口,这样我就可以注入一个模拟或存根进行测试。这只是将问题转移到其他地方,因为我仍然需要覆盖我的包装器方法,但至少它们将与逻辑隔离。

  • 使用JOptionPane的实例代替类引用来调用它上面的方法(我认为我不会在模拟实例时遇到任何问题,因为类不是最终的)。缺点是我会收到很多关于“在实例变量上调用静态方法”的警告,但这是付出的代价。

  • 根本不要模拟JOptionPane并使用Robot来触发输入事件来处理它。这可能非常麻烦且不够强大......除此之外,我使用的是内部对话框,这需要额外的工作来设置JDesktopPaneJInternalFrame等等。

还有其他想法或建议吗?

谢谢!

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

1 个答案:

答案 0 :(得分:2)

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

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

  • 使用Robot模拟输入 - 是的,这听起来非常脆弱。您在此时依赖JOptionPane的内部结构和实现细节,这不是一个好地方。 JOptionPane s'的行为和按钮顺序也可能因不同的外观而有所不同(即OK,Cancel vs. Cancel,OK)。最后,这将无法在无头环境中工作(尽管如果您已经在测试中使用JOptionPane,并且计划始终在台式机上进行测试,那么这不是问题。)