您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關怎樣使用Rule,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
討論一種擴展JUnit4的方式,即,直接修改Test Runner的實現(BlockJUnit4ClassRunner)。但這種方法顯然不便于靈活地添加或刪除擴展功能。這里將使用JUnit4.7才開始引入的擴展方式--Rule來實現相同的擴展功能。
1. Rule
Rule是JUnit4.7才開始提供的一種擴展方式,它能夠替代大部分已有的Runner擴展。JUnit包含兩種Rule Annotation:@ClassRule與@Rule。@ClassRule應用于測試類中的靜態變量,而@Rule應用于成員變量;相同地是,這些變量必須是TestRule接口的實例,且訪問修飾符必須為public。
對BlockJUnit4ClassRunner進行了擴展,被擴展的方法是methodBlock,現在我們來看看該方法體中的代碼:
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(),withPotentialTimeout(),withBefores()和withAfters()都已經被標注為過時,JUnit建議使用Rule來替代這些方法的功能。
2. TestLogRule
如第1節所述,Rule Annotation要作用于TestRule接口的實例,那么就要先創建一個TestRule的實現類。
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與上篇博文中的LoggedRunner的代碼有許多相同之處,功能則都是打印出指定的日志,每行日志又以當時的執行時間與完整方法名作為前綴。
3. 使用Rule的CalculatorTest
下面是新的測試類CalculatorTest,它將不使用BlockJUnit4ClassRunner的擴展LoggedRunner作為測試執行器,所以該類沒有使用@RunWith(LoggedRunner.class),那么在執行該測試類時仍然會使用BlockJUnit4ClassRunner。
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); } }
與上篇博文中的CalculatorTest相比,本文中的CalculatorTest除了沒有使用LoggedRunner之外,還多了兩行代碼:
@Rule public TestLogRule testLogRule = new TestLogRule();
在執行單元測試方法之前,BlockJUnit4ClassRunner會調用TestRule/TestLogRule中的apply()方法,即,會先打印出日志內容。
4. 小結
使用Rule對JUnit進行擴展,能夠避免對默認Runner的擴展,為測試類添加或移除Rule十分方便,而且Rule實現類本身也能很方便地被復用。
上述就是小編為大家分享的怎樣使用Rule了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。