閱讀前提java
瞭解JUnitsegmentfault
對JUnit的內部實現有興趣maven
代碼版本: junit 4.12
代碼搜索工具: http://grepcode.com/
經常使用符號工具
_
: 用來略去代碼段中可有可無的parameter測試
...
: 用來略去可有可無的代碼實現ui
本文的展開方式:連續提出問題,經過閱讀JUnit源代碼回答。spa
若是您看了[深刻JUnit] @Before, @After, @Test的祕密], 裏面的BlockJUnit4ClassRunner
是經過本文涉及到的,一個叫AllDefaultPossibilitiesBuilder
的類,與JUnitCore
鏈接到一塊兒的。JUnitCore是今天的主角!code
Q1: 好比說咱們有一個SampleTest
類,如何調用JUnit來運行測試?
A: JUnit有一個JUnitCode的類,他的描述是blog
JUnitCore is a facade for running tests.
因此,這個是運行測試的一個入口。Facade模式就是把錯綜複雜的子模塊隱藏起來,暴露幾個簡單的API給用戶使用。
source code:
http://grepcode.com/file/repo1.maven.org...
Q2: 哪該使用JUnitCore的那個函數?
A: 瞄一眼JUnitCore,有一個main函數。大喜
public static void main(String... args) { Result result = new JUnitCore().runMain(new RealSystem(), args); System.exit(result.wasSuccessful() ? 0 : 1); }
Q3: JUnitCore#runMain
內部有什麼有意思的要看的東西?
A: JUnitCore#runMain
最終落腳到org.junit.runner.Runner#run這個函數。runner是如何決定的?請看org.junit.internal.builders.AllDefaultPossibilitiesBuilder
內部。
http://grepcode.com/file/repo1.maven.org...
Q4: JUnitCore
這個類有什麼瑕疵麼?
A: 這個類全部的methods都是public的,有好幾個method的生命讓人感受很費解。做爲一個facade類,應該提供儘量少的,封裝良好的方法。但JUnit
提供了8個run**的方法,其中runMain
,runClasses(Computer, classes)
,runRequest
都應該是protected(package private),由於其中泄露了不少子系統的model概念,例如Request
, Computer
之類。
JUnitCore是一個facade類,他提供了幾個測試入口::main
, runClass
啥的。
AllDefaultPossibilitiesBuilder
這個類存了幾個默認的Test Runner。經常使用的BlockJUnit4ClassRunner
就在其中
JUnitCore
http://grepcode.com/file/repo1.maven.org...
http://grepcode.com/file/repo1.maven.org...
AllDefaultPossibilitiesBuilder
http://grepcode.com/file/repo1.maven.org...
泛泛地瞭解了JUnit的code path,暫時沒興趣繼續深挖了。
接下來,打算轉戰倡導Mockito。Mockito::mock, Mockito::doReturn這些函數我以爲挺神奇的。