Вариант 1:
лучший вариант - написать собственную реализацию Runner
, унаследованную от org.junit.runners.BlockJUnit4ClassRunner
, и объявить ее в контексте выполнения, например, как главный класс необработанной командной строки Java.
Получите вдохновение от исходного кода JUnit (он действительно небольшой), в основном org.junit.runners.ParentRunner и самостоятельно переопределите метод runChildren
, чтобы получить возможность выйти из цикла выполнения при сработала команда останова.
Завод для Runner
является Request
. Для начала вы вызываете
(new JUnitCore()).run(Request.runner(new MyStoppableRunner().aClass(ClassToRun))
Вариант 2:
Если в вашем контексте использование собственного бегуна невозможно (например, запущено в Eclipse), благодаря реализации RunListener
, зарегистрированной в используемом бегуне, вы можете получить ссылку на поток, выполняющий ваш тестовый пример.
Если была запущена команда останова, ваш слушатель может выбросить RuntimeException
или даже Error
в надежде, что исходный тестовый бегун потерпит крах.
Бонус
Эти два параметра являются базовыми, так как цель состоит в том, чтобы проверить состояние остановки и не повторять циклы на методах или тестовых классах.
Вы можете попытаться прервать тестовый поток, если застряли в состоянии ожидания или ожидания. Для этого должна быть создана нить сторожевого устройства, которая будет вызывать interrupt
в тестовой нити после истечения времени бездействия.