Тест JUnit должен фактически проверять и проверять результат.В этом конкретном случае ваш тест выдает результат, который должен проверить разработчик / тестировщик, поэтому это не автоматизация.Я предлагаю вам использовать Future<?>
для отслеживания статуса выполнения ваших задач.Для Runnable
задач get()
метод Future<?>
вернет null
, если задача выполнена успешно, в противном случае он отправит вам исключение, заключенное в ExecutionException
.Код будет выглядеть так:
@Test
void runRunner() {
ExecutorService executor = Executors.newFixedThreadPool(3);
String[] componentsToTrack = {"x", "y", "z"};
assertNull(executor.submit(new ConcurrentComponentTracker(componentsToTrack[0]).get());
assertNull(executor.submit(new ConcurrentComponentTracker(componentsToTrack[1]).get());
assertNull(executor.submit(new ConcurrentComponentTracker(componentsToTrack[2]).get());
// cleanup and shutdown pool
executor.shutdown();
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
// ignore this
}
}
Перед этим вы должны удалить try/catch
блок внутри вашего run()
метода.
Еще одна вещь, которую вы, вероятно, можете улучшить, - это сделать исполнителяполя вашего класса тестирования и управляйте им с помощью традиционного жизненного цикла JUnit, используя @BeforeClass
, @Before
, ... для инициализации, очистки между тестами, корректного завершения работы пула.Имейте в виду, что пулы потоков не так дешевы с точки зрения ресурсов.
Надеюсь, это поможет!
PS , если ваша цель - параллельная обработка ваших ConcurrentComponentTracker
Вы можете хранить Future<?>
в некоторой коллекции и запускать утверждения после того, как все задачи будут отправлены.