成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

探索JUnit4擴展:使用Rule

開發 后端
本文將使用JUnit4.7才開始引入的擴展方式--Rule來實現相同的擴展功能。使用Rule對JUnit進行擴展,能夠避免對默認Runner的擴展,為測試類添加或移除Rule十分方便,而且Rule實現類本身也能很方便地被復用。

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

1. Rule

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

在上篇博文中,對BlockJUnit4ClassRunner進行了擴展,被擴展的方法是methodBlock,現在我們來看看該方法體中的代碼:

  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()都已經被標注為過時,JUnit建議使用Rule來替代這些方法的功能。

2. TestLogRule

如第1節所述,Rule Annotation要作用于TestRule接口的實例,那么就要先創建一個TestRule的實現類。

  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的代碼有許多相同之處,功能則都是打印出指定的日志,每行日志又以當時的執行時間與完整方法名作為前綴。

3. 使用Rule的CalculatorTest

下面是新的測試類CalculatorTest,它將不使用BlockJUnit4ClassRunner的擴展LoggedRunner作為測試執行器,所以該類沒有使用@RunWith(LoggedRunner.class),那么在執行該測試類時仍然會使用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(82);  
  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(80);  
  19. }  

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

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

在執行單元測試方法之前,BlockJUnit4ClassRunner會調用TestRule/TestLogRule中的apply()方法,即,會先打印出日志內容。

4. 小結

使用Rule對JUnit進行擴展,能夠避免對默認Runner的擴展,為測試類添加或移除Rule十分方便,而且Rule實現類本身也能很方便地被復用。

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

【編輯推薦】

  1. Java進行HTML數據采集:淺談強大的group正則
  2. 利用JavaMail API 解析MIME
  3. 詳細解析Java中抽象類和接口的區別
  4. Cinch和Sysmon發布 Java輔助開發工具
  5. 解讀Java環境變量配置
責任編輯:林師授 來源: Sha Jiang的博客
相關推薦

2011-12-26 10:49:27

JavaJUnitRunner

2009-06-08 19:59:09

EclipseJUnit單元測試

2009-06-08 19:57:29

EclipseJUnit4單元測試

2024-06-07 09:19:00

AIjson字符串

2009-06-08 20:04:06

EclipseJUnit4單元測試

2011-12-01 14:40:18

JUnitJava

2021-04-21 08:56:46

Java注解反射

2012-02-07 09:08:50

Feed4JUnitJava

2021-01-07 14:06:30

Spring BootJUnit5Java

2014-04-24 09:49:57

Android測試異步任務

2016-09-23 10:20:22

JUnit擴展模型Extension

2013-01-07 13:54:17

Android開發JUnit單元測試

2023-01-06 08:06:52

Groovy類型擴展

2011-08-05 09:09:59

英特爾云計算

2024-05-06 11:30:06

2013-06-04 09:49:04

Spring單元測試軟件測試

2011-08-24 11:31:47

CREATE RULE中文man

2011-08-24 14:40:50

DROP RULE中文man

2012-04-26 13:46:04

ibmdw

2009-05-04 09:28:36

JunitJava
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久99深爱久久99精品 | 久久久久久国产 | 一区二区三区欧美在线观看 | 大伊人久久 | 美女天堂在线 | 国产中文字幕在线 | 亚洲精品在线国产 | 狠狠干网站| av一区在线 | 精品欧美一区二区三区久久久小说 | 久久伊 | 久久久久久国模大尺度人体 | 久久综合成人精品亚洲另类欧美 | av看看| 国产一区二区三区高清 | 国产不卡一区 | 国产成人精品久久二区二区91 | 亚洲日韩中文字幕一区 | 精品少妇一区二区三区在线播放 | 国产馆| 天天爽一爽 | 狠狠婷婷综合久久久久久妖精 | 精品日韩一区二区 | 国产三级电影网站 | 天天久久| 日韩影院一区 | 国产精品国产三级国产aⅴ中文 | 91观看 | 久久精品成人 | 精品国产一区二区三区久久影院 | 国产在线观看一区二区三区 | 爱爱视频网 | 久久久久国产精品一区二区 | 奇米影视77 | 精品国产一区二区三区性色av | 97精品国产97久久久久久免费 | 欧美精品一区二区免费 | 在线四虎| 91久久综合亚洲鲁鲁五月天 | 欧美精品二区 | 日韩精品一区二区三区在线播放 |