【问题标题】:Using System Rules to intercept System.exit() fails with Swing windows使用系统规则拦截 System.exit() 在 Swing 窗口中失败
【发布时间】:2015-04-23 16:56:02
【问题描述】:

我的任务是为在各种情况下 System.exit(1) 所需的实用程序应用程序设置一些 JUnit 测试,System Rules 非常适合测试它。该应用程序还可以在 GUI 模式下运行,它会弹出一个小的 JFrame。当它在应用了 ExpectedSystemExit 规则的 JUnit 测试上下文中运行时,随着 JFrame 的构建,某些东西会偷偷地退出 jvm。关闭 ExpectedSystemExit 规则,测试正常运行,弹出 JFrame 就好了,只是我无法再测试 jvm exit()s。

猜测可能是实施的 SecurityManager 系统规则 1.9.0 不允许某些权限。我仍在收集更多调试信息。在那之前,这个问题是否有已知的解决方案?

【问题讨论】:

  • 你在调用setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)吗?它调用SecurityManager.checkExit,系统规则将其解释为exit()
  • @Banthar 事实上,进一步调试显示setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) 正在触发exit()。那么,现在呢?

标签: java junit4 junit-rule system-rules


【解决方案1】:

setDefaultCloseOperation 调用SecurityManager.checkExit 来验证exit 可以被调用。系统规则基于SecurityManager 并将其解释为对exit 的调用。这既会导致您的测试失败,也会导致无法构建您的 awt 窗口。

您必须在ExpectedSystemExit 注册SecurityManager 之前创建您的窗口并调用setDefaultCloseOperation。例如在@BeforeClass 方法中:

@Rule
public ExpectedSystemExit exit = ExpectedSystemExit.none();

static JFrame frame;

@BeforeClass
public static void before() {
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

@Test
public void test() {
    exit.expectSystemExitWithStatus(0);
    frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
}

【讨论】:

  • 这将需要在构建 JFrame 后更改应用程序以放入挂钩。我希望有一个现场解决方案。
  • 您可以编写自定义SecurityManager,当从setDefaultCloseOperation 调用时,其行为会有所不同。
猜你喜欢
  • 1970-01-01
  • 2021-07-06
  • 2022-07-07
  • 2012-07-19
  • 2015-10-04
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多