[深刻JUnit] 測試運行的入口

閱讀前提java

代碼版本: junit 4.12
代碼搜索工具: http://grepcode.com/
經常使用符號工具

  • _: 用來略去代碼段中可有可無的parameter測試

  • ...: 用來略去可有可無的代碼實現ui

本文的展開方式:連續提出問題,經過閱讀JUnit源代碼回答。spa

劇透

若是您看了[深刻JUnit] @Before, @After, @Test的祕密], 裏面的BlockJUnit4ClassRunner是經過本文涉及到的,一個叫AllDefaultPossibilitiesBuilder的類,與JUnitCore鏈接到一塊兒的。JUnitCore是今天的主角!code

Q&A

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**的方法,其中runMainrunClasses(Computer, classes)runRequest都應該是protected(package private),由於其中泄露了不少子系統的model概念,例如Request, Computer之類。

Summary

  • JUnitCore是一個facade類,他提供了幾個測試入口::main, runClass啥的。

  • AllDefaultPossibilitiesBuilder這個類存了幾個默認的Test Runner。經常使用的BlockJUnit4ClassRunner就在其中

References

下期內容

泛泛地瞭解了JUnit的code path,暫時沒興趣繼續深挖了。
接下來,打算轉戰倡導Mockito。Mockito::mock, Mockito::doReturn這些函數我以爲挺神奇的。

相關文章
相關標籤/搜索