在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ 關于Junit3.8.1的一個問題?

關于Junit3.8.1的一個問題?

在閱讀Junit3.8.1源碼的時候,正常來說,測試的時候首先是執(zhí)行TestRunner中的main方法,但是我打斷點的時候發(fā)現(xiàn)并沒有走這里,將斷點打在TestCase類中,發(fā)現(xiàn)可以進入,說明代碼走到了這里,我觀察debug窗口,發(fā)現(xiàn)一個問題,如下圖:

clipboard.png

發(fā)現(xiàn)testRunner的類型是JUnit3IdeaTestRunner這個類,我很好奇,Idea在Junit測試時做了哪些工作導致這一現(xiàn)象的?

請教大家,謝謝!

回答
編輯回答
吢涼

自問自答

clipboard.png

如圖,當我們右鍵執(zhí)行Junit測試時,首先調用的是Idea的Junit插件中的JUnitStarter類中的main函數(shù),由main函數(shù)調用該類的prepareStreamsAndStart方法,接著執(zhí)行IdeaTestRunner類的startRunnerWithArgs方法,繼續(xù)調用Junit3IdeaTestRunner的startRunnerWithArgs方法,最后開始調用我們自己類TestRunner的doRun方法。Junit的插件包含以下內容

clipboard.png

接下來,請教大家如何調試Idea中的Junit插件源碼呢?以便于我繼續(xù)來更新該答案,更深入來研究一下,并畫出調用時序圖。

-----------------------------補充-------------------------------------
時序圖文字版(websequence):

title Junit3.8.1調用時序圖

JUnitStarter->JUnitStarter: main
note right of JUnitStarter: 參數(shù)(args{"-ideVersion5",n"-junit3","被測試類名,方法名"})
JUnitStarter->JUnitStarter: prepareStreamsAndStart
note right of JUnitStarter: 參數(shù)(args{"被測試類名,方法名"},nagentName{"com.intellij.junit3.JUnit3IdeaTestRunner",nlisteners{size=0},nname{null}})

note right of JUnitStarter: 參數(shù)(IdeaTestRunner,nargs{"被測試類名,方法",nlisteners{size=0},nname{null},count=1,n sendTree=true})
JUnitStarter->+IdeaTestRunner.Repeater:startRunnerWithArgs

note right of IdeaTestRunner.Repeater: 參數(shù)(args{"被測試類名,方法名"},nname=null,ncount=1,nsendTree=true})
IdeaTestRunner.Repeater->+JUnit3IdeaTestRunner:startRunnerWithArgs

note left of TestRunner: 參數(shù)(Test=被測試類實例)
JUnit3IdeaTestRunner->+TestRunner:父類doRun方法

note left of TestRunner: 參數(shù)(Test=被測試類實例,wait=false)
TestRunner->JUnit3IdeaTestRunner:自身doRun方法

note left of TestRunner: 參數(shù)(Test=被測試類實例,wait=false)
JUnit3IdeaTestRunner->TestRunner:父類doRun方法

TestRunner->+TestCase:被測試類類的父類run方法

TestCase->+TestResult:run方法(參數(shù)TestCase=被測試類實例)

TestResult->TestResult:startTest(參數(shù)TestCase=被測試類實例)處理監(jiān)聽

TestResult->TestCase:被測試父類的runBare

TestCase->TestCase:setUp

TestCase->TestCase:runTest(反射調用調用調用被測試類方法)

TestCase->TestCase:tearDown

TestCase-->TestResult:調用返回

TestResult->TestResult:endTest(參數(shù)TestCase=被測試類實例)處理監(jiān)聽

TestResult-->-TestCase:調用返回

TestCase-->-TestRunner:調用返回

TestRunner-->-JUnit3IdeaTestRunner:調用返回

JUnit3IdeaTestRunner->-IdeaTestRunner.Repeater:調用返回

IdeaTestRunner.Repeater->-JUnitStarter:調用返回

圖片版:

clipboard.png

2017年1月8日 14:22