日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

在使用JUnit的過程中,大家可能會(huì)對JUnit進(jìn)行一些擴(kuò)展。本文中的示例為JUnit4定義了一個(gè)新的Annotation,并相應(yīng)地對已有的Runner進(jìn)行擴(kuò)展,使其能夠解析新引入的Annotation。(2011.12.25***更新)

創(chuàng)新互聯(lián)公司自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元新吳做網(wǎng)站,已為上家服務(wù),為新吳各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108

本文臆造了一個(gè)示例,會(huì)在執(zhí)行單元測試方法之前,自動(dòng)地為單元測試方法打印日志。該示例會(huì)為JUnit定義一個(gè)新的Annotation用于指定要打印的日志內(nèi)容,并對JUnit默認(rèn)提供的Runner實(shí)現(xiàn)BlockJUnit4ClassRunner進(jìn)行擴(kuò)展,使其能夠識(shí)別這個(gè)新的Annotation。

1. 定義Annotation

TestLogger是一個(gè)作用于方法的Annotation,它只有一個(gè)屬性,用于指定日志的內(nèi)容,其代碼如下所示,

 
 
 
  1. @Target({ ElementType.METHOD })  
  2. @Retention(RetentionPolicy.RUNTIME)  
  3. public @interface TestLogger {  
  4. public String log() default "";  

2. 擴(kuò)展Runner

JUnit提供了若干個(gè)Runner的實(shí)現(xiàn),如BlockJUnit4ClassRunner,Suite,其中BlockJUnit4ClassRunner用來執(zhí)行單個(gè)測試用例類。LoggedRunner將擴(kuò)展BlockJUnit4ClassRunner,覆寫其中的methodBlock()方法。新的methodBlock()方法會(huì)在一開始試圖獲取被執(zhí)行測試方法中的TestLogger Annotation,如果存在的話,就會(huì)打印出指定的日志,每行日志以當(dāng)時(shí)的執(zhí)行時(shí)間與完整方法名作為前綴。該類的代碼如下所示,

 
 
 
  1. public class LoggedRunner extends BlockJUnit4ClassRunner {  
  2.  
  3. private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS");  
  4.  
  5. public LoggedRunner(Class klass) throws InitializationError {  
  6. super(klass);  
  7. }  
  8.  
  9. @Override 
  10. protected Statement methodBlock(FrameworkMethod method) {  
  11. Method classMethod = method.getMethod();  
  12. TestLogger loggerAnnotation = classMethod.getAnnotation(TestLogger.class);  
  13. if (loggerAnnotation != null) {  
  14. StringBuilder log = new StringBuilder(format.format(new Date()));  
  15. log.append(" ").append(classMethod.getDeclaringClass().getName())  
  16. .append("#").append(classMethod.getName()).append(": ")  
  17. .append(loggerAnnotation.log());  
  18. System.out.println(log.toString());  
  19. }  
  20. return super.methodBlock(method);  
  21. }  

3. 應(yīng)用程序

Calculator是一個(gè)簡單的應(yīng)用程序,其中定義了一個(gè)除法方法,代碼如下所示,

 
 
 
  1. public class Calculator {  
  2. public int divide(int a, int b) {  
  3. return a / b;  
  4. }  

4. 單元測試程序

CalculatorTest是一個(gè)簡單的單元測試程序,它會(huì)使用兩種方式對Calculator中的divide()方法進(jìn)行單元測試。其代碼如下所示,

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

值得注意的是,CalculatorTest特別指定LoggedRunner作為測試執(zhí)行器(@RunWith(LoggedRunner.class));同時(shí),每個(gè)單元測試方法,simpleDivide()與dividedByZero(),都使用了Annotation TestLogger,為其指定日志內(nèi)容。當(dāng)執(zhí)行上述單元測試時(shí),會(huì)自動(dòng)地打印出如下形式的日志內(nèi)容:

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. 小結(jié)

通過對BlockJUnit4ClassRunner的擴(kuò)展,可以讓JUnit在運(yùn)行測試用例時(shí)做一些額外的工作。但這種直接修改默認(rèn)Test Runner的方式并不被提倡,在下一篇文章中將會(huì)介紹使用Test Rule來達(dá)到相同的擴(kuò)展目的。

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


本文題目:探索JUnit4擴(kuò)展:擴(kuò)展Runner
分享鏈接:http://www.5511xx.com/article/cceoepp.html