<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    John Jiang

    a cup of Java, cheers!
    https://github.com/johnshajiang/blog

       :: 首頁 ::  :: 聯系 :: 聚合  :: 管理 ::
      131 隨筆 :: 1 文章 :: 530 評論 :: 0 Trackbacks
    探索JUnit4擴展:擴展Runner
    在使用JUnit的過程中,大家可能會對JUnit進行一些擴展。本文中的示例為JUnit4定義了一個新的Annotation,并相應地對已有的Runner進行擴展,使其能夠解析新引入的Annotation。(2011.12.25最后更新)

    本文臆造了一個示例,會在執行單元測試方法之前,自動地為單元測試方法打印日志。該示例會為JUnit定義一個新的Annotation用于指定要打印的日志內容,并對JUnit默認提供的Runner實現BlockJUnit4ClassRunner進行擴展,使其能夠識別這個新的Annotation。

    1. 定義Annotation
        TestLogger是一個作用于方法的Annotation,它只有一個屬性,用于指定日志的內容,其代碼如下所示,
    @Target({ ElementType.METHOD })
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TestLogger {
        
    public String log() default "";
    }

    2. 擴展Runner
        JUnit提供了若干個Runner的實現,如BlockJUnit4ClassRunner,Suite,其中BlockJUnit4ClassRunner用來執行單個測試用例類。LoggedRunner將擴展BlockJUnit4ClassRunner,覆寫其中的methodBlock()方法。新的methodBlock()方法會在一開始試圖獲取被執行測試方法中的TestLogger Annotation,如果存在的話,就會打印出指定的日志,每行日志以當時的執行時間與完整方法名作為前綴。該類的代碼如下所示,
    public class LoggedRunner extends BlockJUnit4ClassRunner {

        
    private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS");

        
    public LoggedRunner(Class<?> klass) throws InitializationError {
            
    super(klass);
        }

        @Override
        
    protected Statement methodBlock(FrameworkMethod method) {
            Method classMethod 
    = method.getMethod();
            TestLogger loggerAnnotation 
    = classMethod.getAnnotation(TestLogger.class);
            
    if (loggerAnnotation != null) {
                StringBuilder log 
    = new StringBuilder(format.format(new Date()));
                log.append(
    " ").append(classMethod.getDeclaringClass().getName())
                        .append(
    "#").append(classMethod.getName()).append("")
                        .append(loggerAnnotation.log());
                System.out.println(log.toString());
            }

            
    return super.methodBlock(method);
        }
    }

    3. 應用程序
        Calculator是一個簡單的應用程序,其中定義了一個除法方法,代碼如下所示,
    public class Calculator {

        
    public int divide(int a, int b) {
            
    return a / b;
        }
    }

    4. 單元測試程序
        CalculatorTest是一個簡單的單元測試程序,它會使用兩種方式對Calculator中的divide()方法進行單元測試。其代碼如下所示,
    @RunWith(LoggedRunner.class)
    public class CalculatorTest {

        
    private static Calculator calculator = null;

        @BeforeClass
        
    public static void createCalculator() {
            calculator 
    = new Calculator();
        }

        @Test
        @TestLogger(log 
    = "a simple division.")
        
    public void simpleDivide() {
            
    int value = calculator.divide(82);
            Assert.assertTrue(value 
    == 4);
        }

        @Test(expected 
    = ArithmeticException.class)
        @TestLogger(log 
    = "divided by zero, and an ArithmeticException thrown.")
        
    public void dividedByZero() {
            calculator.divide(
    80);
        }
    }

    值得注意的是,CalculatorTest特別指定LoggedRunner作為測試執行器(@RunWith(LoggedRunner.class));同時,每個單元測試方法,simpleDivide()與dividedByZero(),都使用了Annotation TestLogger,為其指定日志內容。當執行上述單元測試時,會自動地打印出如下形式的日志內容:
    2011-12-13_23:48:38_218 test.CalculatorTest#simpleDivide: a simple division
    2011-12-13_23:48:38_218 test.CalculatorTest#dividedByZero: divided by zero, and an ArithmeticException thrown.

    5. 小結
    通過對BlockJUnit4ClassRunner的擴展,可以讓JUnit在運行測試用例時做一些額外的工作。但這種直接修改默認Test Runner的方式并不被提倡,在下一篇文章中將會介紹使用Test Rule來達到相同的擴展目的。
     
    posted on 2011-12-14 00:01 John Jiang 閱讀(3041) 評論(4)  編輯  收藏 所屬分類: JavaUnitTestJUnit原創

    評論

    # re: 初探JUnit4擴展(原)[未登錄] 2011-12-15 09:58 bruce
    你好,請問一下,如果我要攔截失敗的異常,要重寫BlockJUnit4ClassRunner哪個方法呢?  回復  更多評論
      

    # re: 初探JUnit4擴展(原) 2011-12-15 21:58 Sha Jiang
    @bruce
    可以看看對TestRule/ExpectedException的使用  回復  更多評論
      

    # re: 初探JUnit4擴展(原) 2011-12-20 19:57 來如風
    請問,這個和我直接在方法里logger.info()有啥區別!!  回復  更多評論
      

    # re: 初探JUnit4擴展(原) 2011-12-21 20:12 Sha Jiang
    @來如風
    你是指在單元測試方法中直接使用Logger工具?
    可能是沒什么區別,甚至于在測試方法中直接使用Logger會更好些。
    但在此處,用這個例子只是為了說明一種擴展JUnit的方式罷了。  回復  更多評論
      

    主站蜘蛛池模板: 久久精品亚洲一区二区三区浴池| 免费人成网站在线播放| 亚洲色大成网站WWW久久九九 | 一区二区三区在线免费观看视频| 成人黄软件网18免费下载成人黄18免费视频 | 亚洲欧洲日本天天堂在线观看| baoyu777永久免费视频 | 亚洲大香人伊一本线| 67194熟妇在线永久免费观看| 亚洲视频一区网站| 久久精品国产亚洲av水果派 | 噼里啪啦电影在线观看免费高清| 亚洲精品影院久久久久久| 99在线免费观看视频| 亚洲va在线va天堂va888www| 久久国产精品2020免费m3u8| 亚洲性天天干天天摸| 午夜爽爽爽男女免费观看影院| 亚洲人成在线电影| 国产免费女女脚奴视频网| 亚洲毛片基地4455ww| 国产中文字幕免费| 亚洲综合久久久久久中文字幕| 2021国内精品久久久久精免费| 亚洲三级在线免费观看| 韩国免费三片在线视频| 日韩一级片免费观看| 国精无码欧精品亚洲一区| 99视频免费播放| 在线亚洲午夜片AV大片| 免费看一级做a爰片久久| xxxxx做受大片视频免费| 久久精品国产精品亚洲色婷婷| 日本XXX黄区免费看| 黄色一级毛片免费| 亚洲视频精品在线| 免费国产成人午夜私人影视 | 成人亚洲国产va天堂| 亚洲国产婷婷综合在线精品| 成人片黄网站色大片免费观看APP| 亚洲国产韩国一区二区|