Давайте представим, у меня есть следующий метод, который должен быть испытан:Как избежать Thread.sleep в модульных тестах?
@Autowired
private RoutingService routingservice;
public void methodToBeTested() {
Object objectToRoute = initializeObjectToRoute();
if (someConditions) {
routingService.routeInOneWay(objectToRoute);
} else {
routingService.routeInAnotherWay(objectToRoute);
}
}
В этом случае RoutingService
выполняется в отдельном потоке, таким образом, в его конструкторе мы имеем следующее:
Thread thread = new Thread(this);
thread.setDaemon(true);
thread.start();
Проблема заключается в том, что RoutingService
меняет состояние objectToRoute
, и это именно то, что я хочу проверить, но это не происходит сразу, поэтому тест терпит неудачу. Однако, если я добавлю Thread.sleep()
, тогда он работает, но это плохая практика, как я знаю.
Как я могу избежать Thread.sleep()
в этом случае?
Использование «Thread.sleep» в модульном тесте - это не плохая практика, так как все, что вы делаете, это имитировать прохождение времени, которое необходимо для некоторых модульных тестов. Причина, по которой люди говорят, что использование «Thread.sleep» - это плохая практика, заключается в том, что иногда она используется как попытка исправить состояние гонки. Используете ли вы только «Thread.sleep» в тестах или в исходном коде? –
Когда вы тестируете резьбовой код, как бы вы гарантировали, что ваши юнит-тесты не будут шелушатся? То, что они всегда выполняются детерминированным образом. Я думаю, что насмехается над классом Service is better opiton –
Я использую сон только в тестах, но обнаружил немало мест, где люди упоминают, что обычно сон не так хорош в модульных тестах.Например, плагин SonarLint жалуется и говорит, что это нарушение, и дает следующее описание: «Использование Thread.sleep в тесте - это, как правило, плохая идея. Он создает хрупкие тесты, которые могут непредсказуемо выходить из строя в зависимости от среды (« Проходит моя машина! ") или загрузить." – Rufi