Junit測(cè)試多線程無(wú)法得到結(jié)果的問(wèn)題解決
class Main { public static void main(String[] args) { String trxFileDir = args[0]; String targetDir = args[1]; boolean isDecode = Boolean.parseBoolean(args[2]); ParseMojo parseMojo = new ParseMojo(trxFileDir,targetDir,isDecode); parseMojo.execute(); } }
@Test public void executeEncode() { String trxFileDir = "E:\\MAE\\code\\MyMojoParse\\src\\main\\resources\\inputFile\\"; String targetDir = "E:\\MAE\\code\\MyMojoParse\\src\\main\\resources\\outputFile\\"; boolean isEncode = true; ParseMojo parser = new ParseMojo(trxFileDir, targetDir, isEncode); parser.execute(); }
解析工具支持多線程,核心代碼如下
Arrays.stream(trxFiles).forEach(trx -> PARSE_POOL.execute(() -> { convertToBinaryFile(trx); }));
猜測(cè)可能原因
首先當(dāng)前問(wèn)題和業(yè)務(wù)邏輯無(wú)關(guān),初步懷疑是多線程和UT的問(wèn)題,可能Junit進(jìn)行測(cè)試的時(shí)候,主線程結(jié)束會(huì)導(dǎo)致子線程也終止。
問(wèn)題排查
添加打印,查看文件的中斷處
打印結(jié)果如下:
很明顯,主進(jìn)程結(jié)束退出的時(shí)候,子進(jìn)程還沒(méi)有執(zhí)行完成,且每次執(zhí)行到的位置不一致
問(wèn)題原因
分析Junit源碼
public static void main(String args[]) { TestRunner aTestRunner = new TestRunner(); try { TestResult r = aTestRunner.start(args); if (!r.wasSuccessful()) { System.exit(FAILURE_EXIT); } System.exit(SUCCESS_EXIT); } catch (Exception e) { System.err.println(e.getMessage()); System.exit(EXCEPTION_EXIT); } }
這是Junit運(yùn)行的入口,我們可以發(fā)現(xiàn),不管Junit測(cè)試是否成功,都會(huì)調(diào)用System.exit(),而這個(gè)方法會(huì)用來(lái)結(jié)束當(dāng)前正在運(yùn)行的java虛擬機(jī)。當(dāng)status=0時(shí)表示正常結(jié)束,status=1表示異常退出(強(qiáng)制退出,程序未執(zhí)行完也會(huì)退出)。JVM都關(guān)閉了,子線程還靠什么運(yùn)行呢?所以這就是問(wèn)題所在。
總結(jié)
在需要被測(cè)試類為多線程執(zhí)行任務(wù)的時(shí)候,注意不要直接使用Junit單元測(cè)試,可能由于系統(tǒng)退出,導(dǎo)致任務(wù)異常中斷。
注意要使并發(fā)工具類如 CountDownLatch、thread.join()保證任務(wù)中的線程全部執(zhí)行完畢。
以上就是Junit測(cè)試多線程無(wú)法得到結(jié)果的問(wèn)題解決的詳細(xì)內(nèi)容,更多關(guān)于Junit測(cè)試多線程無(wú)法得到結(jié)果的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 教你用IDEA配置JUnit并進(jìn)行單元測(cè)試
- SpringMVC框架整合Junit進(jìn)行單元測(cè)試(案例詳解)
- Springboot集成JUnit5優(yōu)雅進(jìn)行單元測(cè)試的示例
- idea +junit單元測(cè)試獲取不到bean注入的解決方式
- Spring Junit單元測(cè)試加載配置文件失敗問(wèn)題
- 如何在Maven項(xiàng)目中運(yùn)行JUnit5測(cè)試用例實(shí)現(xiàn)
- Junit springboot打印測(cè)試方法信息
- Springboot使用Junit測(cè)試沒(méi)有插入數(shù)據(jù)的原因
- Spring Boot通過(guò)Junit實(shí)現(xiàn)單元測(cè)試過(guò)程解析
- Java Junit單元測(cè)試實(shí)例詳解
- SpringBoot 單元測(cè)試JUnit的使用詳解
相關(guān)文章
mybatis-plus如何修改日志只打印SQL語(yǔ)句不打印查詢結(jié)果
這篇文章主要介紹了mybatis-plus如何修改日志只打印SQL語(yǔ)句不打印查詢結(jié)果問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06如何把char數(shù)組轉(zhuǎn)換成String
這篇文章主要介紹了如何把char數(shù)組轉(zhuǎn)換成String問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02淺談java switch如果case后面沒(méi)有break,會(huì)出現(xiàn)什么情況?
這篇文章主要介紹了淺談java switch如果case后面沒(méi)有break,會(huì)出現(xiàn)什么情況?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨想小編過(guò)來(lái)看看吧2020-09-09java?JVM方法分派模型靜態(tài)分派動(dòng)態(tài)分派全面講解
這篇文章主要為大家介紹了java?JVM方法分派模型靜態(tài)分派動(dòng)態(tài)分派全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06利用Spring Session和redis對(duì)Session進(jìn)行共享詳解
這篇文章主要給大家介紹了關(guān)于利用Spring、Session和redis對(duì)Session進(jìn)行共享的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09