繁体   English   中英

如何调用在另一个线程中运行的程序的关闭挂钩

[英]How to invoke shutdown hooks of a program running in another thread

我正在使用Jemmy框架为Swing应用程序编写自动化测试。

我的测试套件通过在新线程中调用其Main类的main方法来运行此应用程序。

我已经写了很多与GUI相关的测试,但是现在我有一个更复杂的任务。

我需要检查被关闭的应用程序在关闭时是否对文件夹进行了一些清理。 此操作可能作为关闭挂钩执行。 是否有可能在不调用System.exit(0)的情况下调用该应用程序的关闭挂钩?

调用此命令时,两个线程都将终止。 但是我希望带有测试的线程在被测试的应用程序关闭后继续运行,以便我可以检查那些文件夹是否仍然存在。 是否可以在不更改测试套件体系结构的情况下调用关闭挂钩?

我找到了,但是没有测试:

ApplicationShutdownHooks.hook().run(); // JRE 6
ApplicationShutdownHooks.runHooks();   // JRE 7

如您所见,方法的名称随时间而改变,这意味着您实际上不应该这样做。 但是,我认为这应该可以完成工作,但是班级是私人的。 使用一些反射,您可以强制执行它。

// JRE 7
try
{
    Class cl = Class.forName("java.lang.ApplicationShutdownHooks");
    Method m = cl.getDeclaredMethod("runHooks");
    m.setAccessible(true);
    m.invoke(null);
} catch (Exception e)
{
    e.printStackTrace(System.out);
}

将关闭挂钩的重要部分放在单独的方法/类中,然后您就可以对该代码进行单元测试,而不必运行整个应用程序。 然后,假设您确实在应用程序启动时注册了钩子,那么您应该几乎可以依靠JVM来调用钩子,因此不要测试钩子实际执行的事实并不是那么糟糕的IMO。 如果您确实需要测试完整的端到端行为,则可能应该在与应用程序uder测试分开的进程中运行测试代码,在这种情况下,您可以测试实际的预期清除行为,而无需“插入”挂钩(例如,在应用程序启动后检查某些文件是否确实存在,但在应用程序关闭后消失)。

如果要编写测试,最好编写良好的测试。

您不需要弄乱JVM来结束线程,而不必弄乱另一个线程:您只需要确保在关闭窗口时执行关闭代码,否则就假定了非正常关闭。 将代码放在可以单独测试的方法中,就可以了。 可能您实际上并不需要向JVM添加关闭挂钩。

您可能要检查(并可能修复)引导程序代码中的系统状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM