亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對線程應用程序進行單元測試

對線程應用程序進行單元測試

慕娘9325324 2021-06-04 13:35:39
我正在考慮如何使用 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 秒。


查看完整回答
反對 回復 2021-06-10
  • 2 回答
  • 0 關注
  • 231 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號