簡體   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