摘要:最近對和的內(nèi)部實現(xiàn)比較感興趣,將在接下來的一段時間,和大家一起深入代碼細(xì)節(jié)。利用原生的和,可以輕松地得到測試類中函數(shù)的。下期內(nèi)容又被誰調(diào)用了呢運(yùn)行的入口在哪里請看深入測試運(yùn)行的入口
最近對JUnit和Mockito的內(nèi)部實現(xiàn)比較感興趣,將在接下來的一段時間,和大家一起深入代碼細(xì)節(jié)。
王侯將相,寧有種乎 (JUnit也沒啥Magic吧)
閱讀前提
聽說過Java Annotation
使用過JUnit
知道@Before, @After, @Test
對JUnit的內(nèi)部實現(xiàn)有興趣
代碼版本: junit 4.12
代碼搜索工具: http://grepcode.com/
常用符號
_: 用來略去代碼段中無關(guān)緊要的parameter
...: 用來略去無關(guān)緊要的代碼實現(xiàn)
Example下面是一個很簡單的JUunit Test Class
public class SampleTest { @Before protected void setUp(){ ... } @Test public void test1(){ ... } @After public void tearDown(){ ... } }
本文要解答的問題:@Before, @Test, @After如何影響test workflow的?
Q&AQ1. 如何提取一個函數(shù)的Annotation信息?
A: 任何Java提供了Method::getDeclaredAnnotations()
Q2. 如何把SampleTest里的methods都羅列出來?
A: Java提供了Class::getDeclaredMethods()
Q3: @Before, @Test, @After的執(zhí)行順序如何保證的?
A: 在junit的BlockJUnit4ClassRunner class中有一段代碼:
Statement statement = methodInvoker(method, _); statement = withBefores(method, _, statement); statement = withAfters(method, _, statement);
http://grepcode.com/file/repo1.maven.org...
Statement可以看做是一個函數(shù)封裝(Functional Interface),內(nèi)部只有一個execute()函數(shù)。method是被@Test修飾的測試函數(shù)(本例中的test1()),withBefores把SampleClass中被@Before修飾的所有函數(shù)找出來,然后封裝成一個新的Statement。
//比如說,可以用下面的naive實現(xiàn) void withBefores(Method m, _, Statement statement) { // 利用Q1和Q2的知識點(diǎn)把@Before修飾的函數(shù)都找出來 Listbefores = ... return new Statement{ @Override public execute() { for (Method b : befores) { b.execute(); } m.execute(); } } }
Q4: Q3中的BlockJUnit4ClassRunner和SampleTest攪合到一起的?
A: 請自己去看BlockJUnit4ClassRunner的constructor的parameter是什么。
利用Java原生的getDeclaredAnnotations和getDeclaredMethods,可以輕松地得到測試類SampleTest中函數(shù)的annotations。
JUnit用一個Statement來做把setUp(),test1(),以及tearDown()封裝到一起,并保證其執(zhí)行順序。
ReferencesJava Annotation
http://www.cnblogs.com/mandroid/archive/...
BlockJUnit4ClassRunner
http://grepcode.com/file/repo1.maven.org...
TestClass::getAnnotatedMethods() http://grepcode.com/file/repo1.maven.org...
下期內(nèi)容BlockJUnit4ClassRunner又被誰調(diào)用了呢?
運(yùn)行unit test的入口在哪里?
請看:[深入JUnit] 測試運(yùn)行的入口
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/65652.html
摘要:劇透如果您看了深入的秘密,里面的是通過本文涉及到的,一個叫的類,與連接到一起的。是今天的主角比如說我們有一個類,如何調(diào)用來運(yùn)行測試有一個的類,他的描述是所以,這個是運(yùn)行測試的一個入口。接下來,打算轉(zhuǎn)戰(zhàn)倡導(dǎo)。 showImg(https://segmentfault.com/img/bVtSbH); 閱讀前提 了解JUnit 對JUnit的內(nèi)部實現(xiàn)有興趣 不妨看看[深入JUnit] @...
摘要:劇透如果您看了深入的秘密,里面的是通過本文涉及到的,一個叫的類,與連接到一起的。是今天的主角比如說我們有一個類,如何調(diào)用來運(yùn)行測試有一個的類,他的描述是所以,這個是運(yùn)行測試的一個入口。接下來,打算轉(zhuǎn)戰(zhàn)倡導(dǎo)。 showImg(https://segmentfault.com/img/bVtSbH); 閱讀前提 了解JUnit 對JUnit的內(nèi)部實現(xiàn)有興趣 不妨看看[深入JUnit] @...
摘要:步驟三為測試類聲明一個帶有參數(shù)的公共構(gòu)造函數(shù),并在其中為第二個環(huán)節(jié)中聲明的幾個變量賦值。步驟五編寫測試方法,使用定義的變量作為參數(shù)進(jìn)行測試。 What is JUnit JUnit is a Regression Testing Framework used by developers to implement unit testing in Java and accelerate p...
摘要:一旦你完成了相應(yīng)函數(shù),只需要把注解刪去,就可以進(jìn)行正常的測試。表示該方法只執(zhí)行一次,并且在所有方法之后執(zhí)行。 測試類型 單元測試(Unit test) 單元測試關(guān)注單一的類. 它們存在的目的是檢查這個類中的代碼是否按照期望正確運(yùn)行. 集成測試(Integration test) 顧名思義, 集成測試是檢查開發(fā)的模塊和其他模塊整合時是否正常工作.雖然集成測試的代碼影響范圍比單元測試要廣,...
閱讀 3774·2021-11-25 09:43
閱讀 2906·2021-11-25 09:43
閱讀 4022·2021-11-24 09:38
閱讀 779·2021-11-18 10:02
閱讀 2342·2021-09-22 15:53
閱讀 3085·2019-08-30 15:44
閱讀 2841·2019-08-30 14:01
閱讀 2974·2019-08-29 15:15