JUnit规则–引发异常时执行附加验证
在本文中,我將快速向您展示如果您需要解決以下挑戰,那么JUnit規則有多方便
方法捕獲異常并必須執行一些額外的任務,然后再拋出或引發包裝異常。
調用額外任務和引發的異常應通過單元測試進行驗證。
這意味著您有一些這樣的代碼
public class MyThrowingClass {private final ExceptionProcessor exceptionProcessor;public MyThrowingClass(ExceptionProcessor exceptionProcessor) {this.exceptionProcessor = exceptionProcessor;}public void runTask() throws NullPointerException {try {// something to do herethrow new NullPointerException("It's null Jim");} catch (NullPointerException e) {exceptionProcessor.process(e); // This call needs to be verifiedthrow e;}} }并在這行中
exceptionProcessor.process(e);需要進行驗證以及引發異常。
直截了當…但是丑陋
我不會詳細介紹此變體
try {cut.runMyMethod(); } catch(Exception e) {verify(...);assertThat(e).isInstanceOf(); }因為我個人盡量避免在測試代碼中嘗試捕獲結構。
容易的第一
驗證引發異常相當容易,JUnit在此處提供了潛在的選項
第一個選項看起來像這樣
@Test(expected = NullPointerException.class) public void myTestWithExpectedParameter() throws Exception {// ... }第二個像這樣
// ... @Rule public ExceptionRule exceptionRule = ExceptionRule.none();// ...@Test public void myTestWithTheExceptionRule() throws Exception {exceptionRule.expect(NullPointerException.class);// ... }不,它變得越來越復雜
上述測試要求背后的問題如下
執行被測方法之后,您執行的所有verify(…)步驟將不會執行,因為如果引發并沒有捕獲到異常,異常將照常停止其余測試方法的執行。
JUnit救援規則
借助JUnit規則,我們即使在引發異常的情況下,也可以輕松地提供一種提供其他驗證步驟的方法。
我知道JUnit已經提供了驗證程序規則,但是我不會使用它。 該類的缺點是在設置時將驗證邏輯刻錄到其中。
因此,我們需要一個規則,該規則允許我們為每個測試指定一個額外的驗證邏輯,該邏輯將在測試執行后應用。
一般用法如下所示
@Rule public VerifyRule verifyRule = new VerifyRule();@Mock ExceptionProcessor exceptionProcessor;@Test() public void working() throws Exception {verifyRule.setVerifier(() -> verify(exceptionProcessor).process(any()));// .. }為了使它運行起來,我們需要做一些事情
- 驗證規則
- 可以在驗證規則上設置的任何類型的回調接口
讓我們從回調接口開始
public interface VerifyRuleCallback {void execute() throws Throwable; }如您所見,這里沒什么特別的。
現在,讓我們專注于VerifyRule
public class VerifyRule implements TestRule {private VerifyRuleCallback verifyRuleCallback;@Overridepublic Statement apply(Statement base, Description description) {return new VerifyRuleStatement(base);}public void setVerifier(VerifyRuleCallback verifyRuleCallback) {this.verifyRuleCallback = verifyRuleCallback;}private class VerifyRuleStatement extends Statement {private final Statement nextStatement;public VerifyRuleStatement(Statement nextStatement) {this.nextStatement = nextStatement;}@Overridepublic void evaluate() throws Throwable {nextStatement.evaluate();verifyRuleCallback.execute();}} }如您所見,它實現了TestRule接口,并提供了一種設置VerifyRuleCallback的方法。 然后,在需要執行以運行我們自己的回調評估的VerifyRuleStatement的評估方法中使用該回調。
綁在一起
使用新規則和回調,測試可能看起來像這樣
public class MyThrowingClassShould {@Rulepublic MockitoRule mockitoRule = MockitoJUnit.rule();@InjectMocksMyThrowingClass cut;@MockExceptionProcessor processor;@Rulepublic ExpectedException exception = ExpectedException.none();@Rulepublic VerifyRule verifyRule = new VerifyRule();@Test()public void execute_the_exception_processor_and_rethrow_the_exception_when_it_occur() throws Exception {verifyRule.setVerifier(() -> verify(processor).process(any(NullPointerException.class)));exception.expect(NullPointerException.class);cut.runTask();} }摘要
正如我們已經看到的那樣,JUnit規則不僅在這種情況下,而且還提出了這樣的測試要求時,提供了一種非常簡潔的方法來創建清晰易懂的測試代碼。
的JUnit 2016-09-26
彼得·道姆(Peter Daum)翻譯自: https://www.javacodegeeks.com/2016/09/junit-rules-executing-additional-verification-exceptions-thrown.html
總結
以上是生活随笔為你收集整理的JUnit规则–引发异常时执行附加验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用中心电脑版下载安装(应用中心安卓版下
- 下一篇: 打破冷漠僵局文章_研究僵局–第3部分