這裡對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原始碼...