日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
探索JUnit4擴(kuò)展:使用Rule

在上一篇文章《探索JUnit4擴(kuò)展:擴(kuò)展Runner》中,討論了一種擴(kuò)展JUnit4的方式,即,直接修改Test Runner的實(shí)現(xiàn)(BlockJUnit4ClassRunner)。但這種方法顯然不便于靈活地添加或刪除擴(kuò)展功能。本文將使用JUnit4.7才開始引入的擴(kuò)展方式--Rule來(lái)實(shí)現(xiàn)相同的擴(kuò)展功能。(2010.12.25***更新)

1. Rule

Rule是JUnit4.7才開始提供的一種擴(kuò)展方式,它能夠替代大部分已有的Runner擴(kuò)展。JUnit包含兩種Rule Annotation:@ClassRule與@Rule。@ClassRule應(yīng)用于測(cè)試類中的靜態(tài)變量,而@Rule應(yīng)用于成員變量;相同地是,這些變量必須是TestRule接口的實(shí)例,且訪問(wèn)修飾符必須為public。

在上篇博文中,對(duì)BlockJUnit4ClassRunner進(jìn)行了擴(kuò)展,被擴(kuò)展的方法是methodBlock,現(xiàn)在我們來(lái)看看該方法體中的代碼:

 
 
 
  1. protected Statement methodBlock(FrameworkMethod method) {  
  2. Object test;  
  3. try {  
  4. test= new ReflectiveCallable() {  
  5. @Override 
  6. protected Object runReflectiveCall() throws Throwable {  
  7. return createTest();  
  8. }  
  9. }.run();  
  10. } catch (Throwable e) {  
  11. return new Fail(e);  
  12. }  
  13.  
  14. Statement statement= methodInvoker(method, test);  
  15. statement= possiblyExpectingExceptions(method, test, statement);  
  16. statement= withPotentialTimeout(method, test, statement);  
  17. statement= withBefores(method, test, statement);  
  18. statement= withAfters(method, test, statement);  
  19. statement= withRules(method, test, statement);  
  20. return statement;  

但在BlockJUnit4ClassRunner中,possiblyExpectingExceptions(),withPotentialTimeout(),withBefores()和withAfters()都已經(jīng)被標(biāo)注為過(guò)時(shí),JUnit建議使用Rule來(lái)替代這些方法的功能。

2. TestLogRule

如第1節(jié)所述,Rule Annotation要作用于TestRule接口的實(shí)例,那么就要先創(chuàng)建一個(gè)TestRule的實(shí)現(xiàn)類。

 
 
 
  1. public class TestLogRule implements TestRule {  
  2. private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS");  
  3. @Override 
  4. public Statement apply(Statement base, Description description) {  
  5. TestLogger testLogger = description.getAnnotation(TestLogger.class);  
  6. if (testLogger != null) {  
  7. StringBuilder log = new StringBuilder(format.format(new Date()));  
  8. log.append(" ").append(description.getClassName()).append("#")  
  9. .append(description.getMethodName()).append(": ")  
  10. .append(testLogger.log());  
  11. System.out.println(log.toString());  
  12. }  
  13. return base;  
  14. }  

如上所示,TestLogRule與上篇博文中的LoggedRunner的代碼有許多相同之處,功能則都是打印出指定的日志,每行日志又以當(dāng)時(shí)的執(zhí)行時(shí)間與完整方法名作為前綴。

3. 使用Rule的CalculatorTest

下面是新的測(cè)試類CalculatorTest,它將不使用BlockJUnit4ClassRunner的擴(kuò)展LoggedRunner作為測(cè)試執(zhí)行器,所以該類沒(méi)有使用@RunWith(LoggedRunner.class),那么在執(zhí)行該測(cè)試類時(shí)仍然會(huì)使用BlockJUnit4ClassRunner。

 
 
 
  1. public class CalculatorTest {  
  2. private static Calculator calculator = null;  
  3. @Rule 
  4. public TestLogRule testLogRule = new TestLogRule();  
  5. @BeforeClass 
  6. public static void createCalculator() {  
  7. calculator = new Calculator();  
  8. }  
  9. @Test 
  10. @TestLogger(log = "a simple division")  
  11. public void simpleDivide() {  
  12. int value = calculator.divide(8, 2);  
  13. Assert.assertTrue(value == 4);  
  14. }  
  15. @Test(expected = ArithmeticException.class)  
  16. @TestLogger(log = "divided by zero, and an ArithmeticException thrown.")  
  17. public void dividedByZero() {  
  18. calculator.divide(8, 0);  
  19. }  

與上篇博文中的CalculatorTest相比,本文中的CalculatorTest除了沒(méi)有使用LoggedRunner之外,還多了兩行代碼:

 
 
 
  1. @Rule 
  2. public TestLogRule testLogRule = new TestLogRule(); 

在執(zhí)行單元測(cè)試方法之前,BlockJUnit4ClassRunner會(huì)調(diào)用TestRule/TestLogRule中的apply()方法,即,會(huì)先打印出日志內(nèi)容。

4. 小結(jié)

使用Rule對(duì)JUnit進(jìn)行擴(kuò)展,能夠避免對(duì)默認(rèn)Runner的擴(kuò)展,為測(cè)試類添加或移除Rule十分方便,而且Rule實(shí)現(xiàn)類本身也能很方便地被復(fù)用。

原文鏈接:http://www.blogjava.net/jiangshachina/archive/2011/12/24/366801.html

【編輯推薦】

  1. Java進(jìn)行HTML數(shù)據(jù)采集:淺談強(qiáng)大的group正則
  2. 利用JavaMail API 解析MIME
  3. 詳細(xì)解析Java中抽象類和接口的區(qū)別
  4. Cinch和Sysmon發(fā)布 Java輔助開發(fā)工具
  5. 解讀Java環(huán)境變量配置

本文題目:探索JUnit4擴(kuò)展:使用Rule
本文鏈接:http://www.dlmjj.cn/article/djjsjij.html