我正在考慮如何使用 mockito 為此編寫測試用例。例如,我的主線程中的部分邏輯是創建一個執行 3 件事的線程。請在下面查看我的注釋代碼。現在 RequestThread 可以根據來自主程序的輸入數量產生多次。public class MainThreads { public static void main(String[] args) { RequestThread rt = new RequestThread("sample"); rt.start(); //RequestThread another = new RequestThread("sample-2"); //another.start(); //RequestThread newThread = new RequestThread("sample-3"); //newThread.start(); } public static class RequestThread implements Runnable{ private final String request; public RequestThread(String request) { this.request = request; } @Override public void run() { //1. Instantiate a service passing the required request parameter MyDataWebService service = new MyDataWebService(request); //2. Get the returned data List<String> dataList = service.requestData(); //3. Write to file Path file = Paths.get("/someDir/" + request); Files.write(file, dataList, Charset.forName("UTF-8")); } }}我的問題是,我無法弄清楚如何為線程類正確編寫 JUnit/Mockito 測試。我一般不太了解 Mockito 和 JUnit,所以我正在尋找一種方法來對線程應用程序進行單元測試。有人可以指導我如何對這樣的事情進行單元測試嗎?
2 回答

隔江千里
TA貢獻1906條經驗 獲得超10個贊
一個獨特的非答案:在 2018 年,您不再使用“原始”線程。
Java 現在提供了更好的抽象,例如ExecutorService。猜猜看:當您讓代碼將任務提交到這樣的服務中時,您可能可以使用同線程執行程序服務對其進行測試。
意思是:通過使用這樣的抽象并將您的交付分解為特定的服務,您可能(幾乎)不僅可以完全測試小單元,還可以測試任務如何進入您的系統并進行處理。
換句話說:您對“任務”進行單元測試,然后在任務進入這樣的執行器時對任務的集成進行“單元”測試。然后你只剩下一些真正的功能/集成測試來檢查“真正的并行”解決方案是否按預期運行。
其他任何事情都會很快變得復雜。在普通單元測試中使用真實線程會導致不一致的行為,或增加運行時間(比如測試等待線程異步執行某事)。
就像你的例子一樣:你的測試只是坐在那里,定期檢查預期的文件是否是用預期的內容編寫的。導致:在失敗之前應該等待多長時間?等待時間不夠長意味著您的測試偶爾會失敗,因為代碼有時需要更長的時間。如果您等待的時間過長,則會增加您運行測試所需的總時間。您不希望以數百個單元測試結束,因為“等待其他線程”需要 10、20 秒。
添加回答
舉報
0/150
提交
取消