Junit 原始碼解析(二)

2021-08-31 10:45:07 字數 2610 閱讀 1911

這裡對blockjunit4classrunner中幾個跟寫單元測試最相關的幾個方法進行分析

(1)構造方法

public blockjunit4classrunner(class<?> klass) throws initializationerror
作用:是取得類的聲名描述,即class<?> klass

(2)createtest

protected object createtest() throws exception
作用:根據class,建立測試用例類例項。

(3)withpotentialtimeout

protected statement withpotentialtimeout(frameworkmethod method,

object test, statement next)

(4)withbefores

protected statement withbefores(frameworkmethod method, object target,

statement statement)

我們在單元測試時加註解@befores,就是呼叫這個方法被執行的。

(5) withafters

protected statement withafters(frameworkmethod method, object target,

statement statement)

我們在單元測試時加註解@afters,就是呼叫這個方法被執行的。

(6) methodblock

protected statement methodblock(frameworkmethod method) 

}.run();

} catch (throwable e)

statement statement= methodinvoker(method, test);

statement= possiblyexpectingexceptions(method, test, statement);

statement= withpotentialtimeout(method, test, statement);

statement= withbefores(method, test, statement);

statement= withafters(method, test, statement);

return statement;

}

(6) methodblock

protected statement methodblock(frameworkmethod method) 

}.run();

} catch (throwable e)

statement statement= methodinvoker(method, test);

statement= possiblyexpectingexceptions(method, test, statement);

statement= withpotentialtimeout(method, test, statement);

statement= withbefores(method, test, statement);

statement= withafters(method, test, statement);

return statement;

}

採用的是雙向鍊錶的資料結構。而statement代表了乙個操作,即單元測試中所要處理的乙個環境。像在單元測試中所加的註解@befores,@afters等等都是statement。statement是個抽象類,所以操作都要重寫evaluate方法,在繼承statement的同時,做成雙向的有序鍊錶,這樣就可以順序的執行操作了。以runbeforetestmethod的源**可以看到這點。

public class runbeforetestmethod extends statement

@override

public void evaluate() throws throwable

}

而前面提到的**

statement statement= methodinvoker(method, test);

statement= possiblyexpectingexceptions(method, test, statement);

statement= withpotentialtimeout(method, test, statement);

statement= withbefores(method, test, statement);

statement= withafters(method, test, statement);

就是在整理各個操作間執行的先後順序。

以上簡單分析了junit是如何執行單元測試用例的。

下一節介紹如何擴做自己的容器。以spring提供實現為例。

Junit原始碼解析總結

前面的部落格我們也已經整理到了,我們使用junit38,在寫 測試類的時候我們的測試類必須繼承testcase。這個所有測試類的父類在junit.framework包下面。前面我們的整理都是說直接在ide中直接執行測試類,右擊然後run as junit。當然我們還可以自己寫main方法來執行測試,...

Junit 原始碼解析(一)

junit 原始碼解析 一 之junit執行容器 package org.junit.runner public abstract class runner implements describable runner是junit的執行容器,它是各種junit執行容器的父類。我們可以把它理解成web容...

JUnit原始碼分析

junit junit原始碼學習和經驗分享。源 裡沒有密碼,好多開源框架都出自大牛大師之手,是學習的好例子,可惜自己沒啥耐心去看,網上搜尋到牛人解析,記錄下來,學習學習。深入junit原始碼之runner 深入junit原始碼之statement 深入junit原始碼之rule 深入junit原始碼...