Как вызвать прерывания завершения программы, запущенной в другом потоке
Я пишу автоматизированные тесты для приложения Swing с использованием фреймворка Jemmy.
Мой набор тестов запустил это приложение, вызвав метод main его класса Main в новом потоке.
Я уже написал много тестов, связанных с GUI, но теперь у меня есть более сложная задача.
Мне нужно проверить, выполняет ли тестируемое приложение некоторую очистку папок, когда оно закрывается. Это действие, вероятно, выполняется как ловушка отключения. Возможно ли каким-то образом вызвать прерывания завершения работы этого приложения без вызова System.exit (0)?
Когда эта команда вызывается, оба потока будут прерваны. Но я хочу, чтобы поток с моими тестами продолжал работать после закрытия тестируемого приложения, чтобы я мог проверить, существуют ли эти папки или нет. Можно ли как-то вызывать перехватчики завершения работы без изменения архитектуры моего набора тестов?
3 ответа
Если вы собираетесь писать тесты, лучше писать хорошие.
Вам не нужно связываться с JVM, чтобы завершить поток, но не другой: вам нужно только быть уверенным, что когда окно закрыто, выполняется код завершения, в противном случае предполагается постепенное отключение. Поместите этот код в метод, который вы можете проверить отдельно, и все готово. Скорее всего, вам не нужно добавлять хук отключения для JVM.
Вы можете проверить (и, возможно, восстановить) состояние системы в вашем коде начальной загрузки.
Я нашел это, но я не проверял это:
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 приложения, в любом случае, в этом случае вы можете протестировать фактическое ожидаемое поведение очистки без необходимости " подключите к "хукам" (например, убедитесь, что некоторые файлы существуют после запуска приложения, но исчезают после его закрытия).