鎺㈢儲JUnit4鎵╁睍錛氫嬌鐢≧ule
鍦ㄤ笂涓綃囨枃绔?a href="http://m.tkk7.com/jiangshachina/archive/2011/12/14/366289.html">銆婃帰绱Unit4鎵╁睍錛氭墿灞昍unner銆?/a>涓紝璁ㄨ浜嗕竴縐嶆墿灞旿Unit4鐨勬柟寮忥紝鍗籌紝鐩存帴淇敼Test Runner鐨勫疄鐜?BlockJUnit4ClassRunner)銆備絾榪欑鏂規硶鏄劇劧涓嶄究浜庣伒媧誨湴娣誨姞鎴栧垹闄ゆ墿灞曞姛鑳姐傛湰鏂囧皢浣跨敤JUnit4.7鎵嶅紑濮嬪紩鍏ョ殑鎵╁睍鏂瑰紡--Rule鏉ュ疄鐜扮浉鍚岀殑鎵╁睍鍔熻兘銆?2010.12.25鏈鍚庢洿鏂?
1. Rule
Rule鏄疛Unit4.7鎵嶅紑濮嬫彁渚涚殑涓縐嶆墿灞曟柟寮忥紝瀹冭兘澶熸浛浠eぇ閮ㄥ垎宸叉湁鐨凴unner鎵╁睍銆侸Unit鍖呭惈涓ょRule Annotation錛欯ClassRule涓嶡Rule銆侤ClassRule搴旂敤浜庢祴璇曠被涓殑闈欐佸彉閲忥紝鑰孈Rule搴旂敤浜庢垚鍛樺彉閲忥紱鐩稿悓鍦版槸錛岃繖浜涘彉閲忓繀欏繪槸TestRule鎺ュ彛鐨勫疄渚嬶紝涓旇闂慨楗扮蹇呴』涓簆ublic銆?br />鍦?a href="http://m.tkk7.com/jiangshachina/archive/2011/12/14/366289.html">涓婄瘒鍗氭枃涓紝瀵笲lockJUnit4ClassRunner榪涜浜嗘墿灞曪紝琚墿灞曠殑鏂規硶鏄痬ethodBlock錛岀幇鍦ㄦ垜浠潵鐪嬬湅璇ユ柟娉曚綋涓殑浠g爜錛?br />protected Statement methodBlock(FrameworkMethod method) {
Object test;
try {
test= new ReflectiveCallable() {
@Override
protected Object runReflectiveCall() throws Throwable {
return createTest();
}
}.run();
} catch (Throwable e) {
return new Fail(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);
statement= withRules(method, test, statement);
return statement;
}
浣嗗湪BlockJUnit4ClassRunner涓紝possiblyExpectingExceptions()錛寃ithPotentialTimeout()錛寃ithBefores()鍜寃ithAfters()閮藉凡緇忚鏍囨敞涓鴻繃鏃訛紝JUnit寤鴻浣跨敤Rule鏉ユ浛浠h繖浜涙柟娉曠殑鍔熻兘銆?br />
2. TestLogRule
濡傜1鑺傛墍榪幫紝Rule Annotation瑕佷綔鐢ㄤ簬TestRule鎺ュ彛鐨勫疄渚嬶紝閭d箞灝辮鍏堝垱寤轟竴涓猅estRule鐨勫疄鐜扮被銆?br />public class TestLogRule implements TestRule {
private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS");
@Override
public Statement apply(Statement base, Description description) {
TestLogger testLogger = description.getAnnotation(TestLogger.class);
if (testLogger != null) {
StringBuilder log = new StringBuilder(format.format(new Date()));
log.append(" ").append(description.getClassName()).append("#")
.append(description.getMethodName()).append(": ")
.append(testLogger.log());
System.out.println(log.toString());
}
return base;
}
}
濡備笂鎵紺猴紝TestLogRule涓?a href="http://m.tkk7.com/jiangshachina/archive/2011/12/14/366289.html">涓婄瘒鍗氭枃涓殑LoggedRunner鐨勪唬鐮佹湁璁稿鐩稿悓涔嬪錛屽姛鑳藉垯閮芥槸鎵撳嵃鍑烘寚瀹氱殑鏃ュ織錛屾瘡琛屾棩蹇楀張浠ュ綋鏃剁殑鎵ц鏃墮棿涓庡畬鏁存柟娉曞悕浣滀負鍓嶇紑銆?br />
3. 浣跨敤Rule鐨凜alculatorTest
涓嬮潰鏄柊鐨勬祴璇曠被CalculatorTest錛屽畠灝嗕笉浣跨敤BlockJUnit4ClassRunner鐨勬墿灞昄oggedRunner浣滀負嫻嬭瘯鎵ц鍣紝鎵浠ヨ綾繪病鏈変嬌鐢ˊRunWith(LoggedRunner.class)錛岄偅涔堝湪鎵ц璇ユ祴璇曠被鏃朵粛鐒朵細浣跨敤BlockJUnit4ClassRunner銆?br />public class CalculatorTest {
private static Calculator calculator = null;
@Rule
public TestLogRule testLogRule = new TestLogRule();
@BeforeClass
public static void createCalculator() {
calculator = new Calculator();
}
@Test
@TestLogger(log = "a simple division")
public void simpleDivide() {
int value = calculator.divide(8, 2);
Assert.assertTrue(value == 4);
}
@Test(expected = ArithmeticException.class)
@TestLogger(log = "divided by zero, and an ArithmeticException thrown.")
public void dividedByZero() {
calculator.divide(8, 0);
}
}
涓?a href="http://m.tkk7.com/jiangshachina/archive/2011/12/14/366289.html">涓婄瘒鍗氭枃涓殑CalculatorTest鐩告瘮錛屾湰鏂囦腑鐨凜alculatorTest闄や簡娌℃湁浣跨敤LoggedRunner涔嬪錛岃繕澶氫簡涓よ浠g爜
@Rule
public TestLogRule testLogRule = new TestLogRule();
鍦ㄦ墽琛屽崟鍏冩祴璇曟柟娉曚箣鍓嶏紝BlockJUnit4ClassRunner浼氳皟鐢═estRule/TestLogRule涓殑apply()鏂規硶錛屽嵆錛屼細鍏堟墦鍗板嚭鏃ュ織鍐呭銆?br />
4. 灝忕粨
浣跨敤Rule瀵笿Unit榪涜鎵╁睍錛岃兘澶熼伩鍏嶅榛樿Runner鐨勬墿灞曪紝涓烘祴璇曠被娣誨姞鎴栫Щ闄ule鍗佸垎鏂逛究錛岃屼笖Rule瀹炵幇綾繪湰韜篃鑳藉緢鏂逛究鍦拌澶嶇敤銆傚湪涓嬩竴綃囧崥鏂?/a>涓皢榪涗竴姝ユ帰绱ule鐨勫簲鐢ㄣ?/div>
]]>