4

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

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

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

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

  • 根本不要模拟JOptionPane并使用Robot触发输入事件来处理它。这可能非常麻烦而且不太健壮......除此之外,我正在使用内部对话框,这需要额外的工作来设置JDesktopPane, JInternalFrames 等等。

还有其他想法或建议吗?

谢谢!

更新:顺便说一句,我尝试过模拟一个JOptionPane 实例,似乎方法调度程序忽略了实例,直接选择了以前存在的静态方法(毕竟这是有道理的),所以第二个选项被丢弃了。

4

1 回答 1

2
  • 写一个包装器JOptionPane——这绝对是最健壮的选项,并且还允许您为自己编写方便的速记方法。我会选这个。如果像我和大多数其他开发人员一样,您的项目中已经有一些 GUI 帮助程序类,他们可以去那里。

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

  • 使用 aRobot来模拟输入 - 是的,这对我来说听起来非常脆弱。你变得依赖于那个JOptionPane时候的内部结构和实现细节,这不是一个好地方。 JOptionPanes 的行为和按钮顺序也可能在不同的外观和感觉下有所不同(即 OK、Cancel 与 Cancel、OK)。最后,这在无头环境中不起作用(尽管如果您已经JOptionPane在测试中使用 s,并且计划始终在台式机上进行测试,那么这不是问题)。

于 2011-03-29T10:46:31.920 回答