成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[深入JUnit] @Before, @After, @Test的秘密

dongfangyiyu / 3561人閱讀

摘要:最近對(duì)和的內(nèi)部實(shí)現(xiàn)比較感興趣,將在接下來的一段時(shí)間,和大家一起深入代碼細(xì)節(jié)。利用原生的和,可以輕松地得到測(cè)試類中函數(shù)的。下期內(nèi)容又被誰(shuí)調(diào)用了呢運(yùn)行的入口在哪里請(qǐng)看深入測(cè)試運(yùn)行的入口

最近對(duì)JUnit和Mockito的內(nèi)部實(shí)現(xiàn)比較感興趣,將在接下來的一段時(shí)間,和大家一起深入代碼細(xì)節(jié)。

王侯將相,寧有種乎 (JUnit也沒啥Magic吧)

閱讀前提

聽說過Java Annotation

使用過JUnit

知道@Before, @After, @Test

對(duì)JUnit的內(nèi)部實(shí)現(xiàn)有興趣

代碼版本: junit 4.12
代碼搜索工具: http://grepcode.com/
常用符號(hào)

_: 用來略去代碼段中無關(guān)緊要的parameter

...: 用來略去無關(guān)緊要的代碼實(shí)現(xiàn)

Example

下面是一個(gè)很簡(jiǎn)單的JUunit Test Class

public class SampleTest {
   @Before
   protected void setUp(){ ... }

   @Test
   public void test1(){ ... }       
   
   @After
   public void tearDown(){ ... }
}

本文要解答的問題:@Before, @Test, @After如何影響test workflow的?

Q&A

Q1. 如何提取一個(gè)函數(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可以看做是一個(gè)函數(shù)封裝(Functional Interface),內(nèi)部只有一個(gè)execute()函數(shù)。method是被@Test修飾的測(cè)試函數(shù)(本例中的test1()),withBeforesSampleClass中被@Before修飾的所有函數(shù)找出來,然后封裝成一個(gè)新的Statement。

//比如說,可以用下面的naive實(shí)現(xiàn)
void withBefores(Method m, _, Statement statement) {
  // 利用Q1和Q2的知識(shí)點(diǎn)把@Before修飾的函數(shù)都找出來
  List befores = ...
  return new Statement{
    @Override
    public execute() {
      for (Method b : befores) {
        b.execute();
      }
      m.execute();
    }
  }
}

Q4: Q3中的BlockJUnit4ClassRunnerSampleTest攪合到一起的?
A: 請(qǐng)自己去看BlockJUnit4ClassRunner的constructor的parameter是什么。

Summary

利用Java原生的getDeclaredAnnotationsgetDeclaredMethods,可以輕松地得到測(cè)試類SampleTest中函數(shù)的annotations。

JUnit用一個(gè)Statement來做把setUp()test1(),以及tearDown()封裝到一起,并保證其執(zhí)行順序。

References

Java 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又被誰(shuí)調(diào)用了呢?
運(yùn)行unit test的入口在哪里?
請(qǐng)看:[深入JUnit] 測(cè)試運(yùn)行的入口

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65652.html

相關(guān)文章

  • [深入JUnit] 測(cè)試運(yùn)行入口

    摘要:劇透如果您看了深入的秘密,里面的是通過本文涉及到的,一個(gè)叫的類,與連接到一起的。是今天的主角比如說我們有一個(gè)類,如何調(diào)用來運(yùn)行測(cè)試有一個(gè)的類,他的描述是所以,這個(gè)是運(yùn)行測(cè)試的一個(gè)入口。接下來,打算轉(zhuǎn)戰(zhàn)倡導(dǎo)。 showImg(https://segmentfault.com/img/bVtSbH); 閱讀前提 了解JUnit 對(duì)JUnit的內(nèi)部實(shí)現(xiàn)有興趣 不妨看看[深入JUnit] @...

    springDevBird 評(píng)論0 收藏0
  • [深入JUnit] 測(cè)試運(yùn)行入口

    摘要:劇透如果您看了深入的秘密,里面的是通過本文涉及到的,一個(gè)叫的類,與連接到一起的。是今天的主角比如說我們有一個(gè)類,如何調(diào)用來運(yùn)行測(cè)試有一個(gè)的類,他的描述是所以,這個(gè)是運(yùn)行測(cè)試的一個(gè)入口。接下來,打算轉(zhuǎn)戰(zhàn)倡導(dǎo)。 showImg(https://segmentfault.com/img/bVtSbH); 閱讀前提 了解JUnit 對(duì)JUnit的內(nèi)部實(shí)現(xiàn)有興趣 不妨看看[深入JUnit] @...

    godlong_X 評(píng)論0 收藏0
  • JUnit4 note

    摘要:步驟三為測(cè)試類聲明一個(gè)帶有參數(shù)的公共構(gòu)造函數(shù),并在其中為第二個(gè)環(huán)節(jié)中聲明的幾個(gè)變量賦值。步驟五編寫測(cè)試方法,使用定義的變量作為參數(shù)進(jìn)行測(cè)試。 What is JUnit JUnit is a Regression Testing Framework used by developers to implement unit testing in Java and accelerate p...

    NicolasHe 評(píng)論0 收藏0
  • junit4備忘錄

    摘要:它由和建立,逐漸成為源于的的家族中最為成功的一個(gè)。與添加進(jìn)入的的依賴中。具有兩個(gè)參數(shù)可選該測(cè)試方法允許執(zhí)行的最大時(shí)間長(zhǎng)度。單位捕獲拋出的異常。這個(gè)類不包含任何方法更改入口類的測(cè)試運(yùn)行器為將要運(yùn)行的測(cè)試類作為數(shù)組傳入到中。 簡(jiǎn)介 JUnit是一個(gè)Java語(yǔ)言的單元測(cè)試框架。它由Kent Beck和Erich Gamma建立,逐漸成為源于Kent Beck的sUnit的xUnit家族中最為...

    TZLLOG 評(píng)論0 收藏0
  • Java JUnit 單元測(cè)試小結(jié)

    摘要:一旦你完成了相應(yīng)函數(shù),只需要把注解刪去,就可以進(jìn)行正常的測(cè)試。表示該方法只執(zhí)行一次,并且在所有方法之后執(zhí)行。 測(cè)試類型 單元測(cè)試(Unit test) 單元測(cè)試關(guān)注單一的類. 它們存在的目的是檢查這個(gè)類中的代碼是否按照期望正確運(yùn)行. 集成測(cè)試(Integration test) 顧名思義, 集成測(cè)試是檢查開發(fā)的模塊和其他模塊整合時(shí)是否正常工作.雖然集成測(cè)試的代碼影響范圍比單元測(cè)試要廣,...

    Rainie 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<