我正在使用PowerMock来模拟JOptionPane
上的静态方法,但是JRE似乎并不是非常符合它,因为我在初始化时得到java.lang.VerifyError
,因为它检查了完整性它自己的包和类。
我有一些解决方法,但我对其中任何一个都不满意:
为JOptionPane
编写一个对象包装器,并为我需要的方法(showInputDialog
等)提供一个接口,这样我就可以注入一个模拟或存根进行测试。这只是将问题转移到其他地方,因为我仍然需要覆盖我的包装器方法,但至少它们将与逻辑隔离。
使用 JOptionPane
的实例代替类引用来调用它上面的方法(我认为我不会在模拟实例时遇到任何问题,因为类不是最终的)。缺点是我会收到很多关于“在实例变量上调用静态方法”的警告,但这是付出的代价。
根本不要模拟JOptionPane
并使用Robot
来触发输入事件来处理它。这可能非常麻烦且不够强大......除此之外,我使用的是内部对话框,这需要额外的工作来设置JDesktopPane
,JInternalFrame
等等。
还有其他想法或建议吗?
谢谢!
更新:通过te方式,我尝试模拟JOptionPane
实例,似乎方法调度程序忽略实例直接选择以前存在的静态方法(这是有意义的,毕竟),所以第二个选项被丢弃。
答案 0 :(得分:2)
为JOptionPane
编写一个包装器 - 这绝对是最强大的选项,并且还允许您为自己编写方便的简写方法。我会选这个。如果像我和大多数其他开发人员一样,你已经在项目的某个地方有了一些GUI助手类,他们可以去那里。
使用实例 - 这不是一个糟糕的解决方案,但绝对不像调用单个静态方法那样易于管理。我不会说增加的复杂性是值得的。
使用Robot
模拟输入 - 是的,这听起来非常脆弱。您在此时依赖JOptionPane
的内部结构和实现细节,这不是一个好地方。 JOptionPane
s'的行为和按钮顺序也可能因不同的外观而有所不同(即OK,Cancel vs. Cancel,OK)。最后,这将无法在无头环境中工作(尽管如果您已经在测试中使用JOptionPane
,并且计划始终在台式机上进行测试,那么这不是问题。)