讓我們想象一下,我有以下方法下進行試驗:如何避免單元測試中的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'嗎? –
當你測試線程代碼時,你如何確保你的單元測試不是片狀的?他們總是以確定性的方式執行。我認爲嘲笑服務類是一個更好的選擇 –
我只在測試中使用睡眠,但發現了很多地方人們提到,一般來說睡眠在單元測試中不是很好。例如,SonarLint插件也抱怨說它違規並給出以下描述:「在測試中使用Thread.sleep通常是一個糟糕的主意,它會產生脆弱的測試,根據環境可能會無法預料地失敗(」Passes on我的機器!「)或加載。」 – Rufi