JUnit Rule 原理分析

2021-08-18 18:31:45 字數 3472 閱讀 8183

為了加深對junit rule的理解,將其拆分出來單獨作為一篇文章講述.

在寫自定義rule之前先對之前說到的系統實現的rule做乙個簡單的原理分析,這樣更能加深我們對自定義rule的理解.強烈建議配合原始碼檢視, 否則可能不知所云.

junit4的預設testrunner 為org.junit.runners.blockjunit4classrunner,其中有乙個methodblock方法,該方法是執行測試的核心方法:

protected statement methodblock(frameworkmethod method) 

}).run();

} catch (throwable var4)

statement statement = this.methodinvoker(method, test);

statement = this.possiblyexpectingexceptions(method, test, statement);

statement = this.withpotentialtimeout(method, test, statement);

statement = this.withbefores(method, test, statement);

statement = this.withafters(method, test, statement);

statement = this.withrules(method, test, statement);

return statement;

}

note : 解釋一下, runner只是乙個抽象類,表示用於執行junit測試用例的工具,通過它可以執行測試並通知給notifier執行的結果。

在junit執行每個測試方法之前,methodblock方法都會被呼叫,它用來把這個測試包裝成乙個statement。statement表示乙個具體的動作,例如測試方法的執行,before方法的執行和rule的呼叫。它使用責任鏈模式,將statement層層包裹,就能形成乙個完整的測試,junit最後執行這個statement。從上面的**中可以看到,以下內容被包裝進了statement中:

測試方法的執行;

異常測試,對應@test(expected=***.class);

超時測試,對應@test(timeout=***);

before方法,對應@before註解的方法;

after方法,對應@after註解的方法;

rule的執行

在statement中使用evaluate方法控制statement執行的先後順序,比如before方法對應的statement的runbefores:

public

class

runbefores

extends

statement

@override

public

void

evaluate() throws throwable

next.evaluate();}}

在evaluate中,所有的before方法會被最先呼叫,因為before方法必須要在測試執行之前呼叫,然後再執行next的evaluate去呼叫下乙個statement。

同理runafter是在執行測試之後再去執行after方法的內容。

public

class

runafters

extends

statement

@override

public

void

evaluate() throws throwable catch (throwable e) finally catch (throwable e) }}

multiplefailureexception.assertempty(errors);}}

在理解上面的statement之後,再回過頭看rule的介面org.junit.rules.testrule:

public

inte***ce

testrule to implement this

* test-running rule.

**@param base the to be modified

*@param description a of the test implemented in

*@return a new statement, which may be the same as ,*/}

通過上面分析我們就可以知道如何實現乙個rule,我們舉個例子:

下面這個例子是可以根據自己輸入的count來決定測試方法迴圈執行,並在每次執行前和執行後做了相應的列印。

package com.lulu.androidtestdemo.junit.rule;

import org.junit.rules.testrule;

import org.junit.runner.description;

import org.junit.runners.model.statement;

/** * created by zhanglulu on 2018/1/24.

*/public

class

looprule

implements

testrule

@override

this.base = base;

this.description = description;

return

new loopstatement(base);

}public

class

loopstatement

extends

statement

@override

public

void

evaluate() throws throwable }}

}

測試我們的looprule

public

class

testlooprule

}

執行結果:

輕鬆搞定 (^▽^)

原理分析 煙氣分析儀工作原理

煙氣分析儀的工作原理常用兩種,一種是電化學工作原理,另一種是紅外工作原理。目前市場上的可攜式煙氣分析儀通常是這兩種原理相結合,電化學煙氣分析儀一般有德國菲索 德國mru德國德圖,國產的有天虹嶗應等,紅外煙氣分析儀廠家一般有德國mru,德國西門子等。以下是這兩種煙氣分析儀的工作原理介紹 電化學氣體感測...

安卓單元測試 八 Junit Rule的使用

乙個junit rule就是乙個實現了testrule的類,這些類的作用類似於 before after,是用來在每個測試方法的執行前後執行一些 的乙個方法。如果你不清楚 before after這些annotation的意思,chances are你還不了解junit的使用,建議先看這篇文章。那為...

fork原理分析

note4 首先必須有一點要清楚,函式的返回值是儲存在暫存器eax中的。其次,當fork返回時,新程序會返回0是因為在初始化任務結構時,將eax設定為0 在fork中,把子程序加入到可執行的佇列中,由程序排程程式在適當的時機排程執行。也就是從此時開始,當前程序 為兩個併發的程序。無論哪個程序被排程執...