1

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

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

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

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

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

4

3 回答 3

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);
}
于 2014-04-06T14:42:58.610 回答
0

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

于 2014-04-06T17:21:13.943 回答
0

如果你要写测试,最好写好的。

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

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

于 2014-04-06T17:32:08.067 回答