2012-03-15 3 views
2

私はテストライフをもっと簡単にするために、MethodRuleと@ Rule-annotationを作成しました。 特定の例外がスローされたかどうかをチェックし、exception-messageが指定されたメッセージと等しいかどうかをチェックします。JUnit MethodRuleは1行だけをテストします

これで、テストする行が多いtestmethodを実行すると、最初の行だけが表示され、準備が整っています。どのようにしてテストメソッドのすべての行がテストされるのですか?

これは私のコードです: 注釈:

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD}) 
public @interface ExpectedDomeinValidatieMessage { 
    String value() default ""; 
    String contains() default ""; 
} 

はMethodRule:

@Override 
public Statement apply(final Statement base, final FrameworkMethod method, final Object target) { 
return new Statement() { 

    @Override 
    public void evaluate() throws Throwable { 
    ExpectedDomeinValidatieMessage message = method.getAnnotation(ExpectedDomeinValidatieMessage.class); 
    if (message == null) { 
     base.evaluate(); 
    } else { 
     try { 
     base.evaluate(); 
     Assert.fail("DomeinValidatieException not thrown"); 
     } catch (DomeinValidatieException e) { 
     if (StringUtils.isNotBlank(message.value())) { 
      if (!e.getMessage().equals(message.value())) { 
      throwException(e, "", message.value(), e.getMessage()); 
      } 
     } 
     if (StringUtils.isNotBlank(message.contains())) { 
      if (!e.getMessage().contains(message.contains())) { 
      throwException(e, "Segment niet gevonden:", message.contains(), e.getMessage()); 
      } 
     } 
     } 
    } 
    } 

    private void throwException(Throwable exception, String message, String expected, String actual) { 
    ComparisonFailure cf = new ComparisonFailure(message, expected, actual); 
    cf.setStackTrace(exception.getStackTrace()); 
    throw cf; 
    } 
}; 

は使用方法:私はこのようにそれを使用する場合は

@Test 
@ExpectedDomeinValidatieMessage("[Werkzaamheden] WerkzaamMetGevaarlijkeStoffen niet gevuld") 
public void valideerWerkzaamMetGevaarlijkeStoffen() throws DomeinValidatieException { 
    aanvraag.getVerzekerde().getWerkzaamheden().setWerkzaamMetGevaarlijkeStoffen(null); 
    validator.valideer(); 
} 

、それだけで最初のテストをテスト方法で:

@Test 
@ExpectedDomeinValidatieMessage("[Werkzaamheden] WerkzaamMetGevaarlijkeStoffen niet gevuld") 
public void valideerWerkzaamMetGevaarlijkeStoffen() throws DomeinValidatieException { 
    aanvraag.getVerzekerde().getWerkzaamheden().setWerkzaamMetGevaarlijkeStoffen(null); 
    validator.valideer(); //Only this one is tested 
    aanvraag.getVerzekerde().getWerkzaamheden().setWerkzaamMetGevaarlijkeStoffen("bla"); 
    validator.valideer(); //This is NOT tested 
} 

答えて

0

JUnit assertXXXメソッドは、例外(特にAssertionError)をスローすることで機能します。そのため、例外がスローされると(コードまたはアサートによって)、コントロールはテストメソッドを終了します。例外がスローされた場所から再起動する方法はありません。

おそらくParameterizedが必要です。異なるパラメータで同じテストを複数回実行することができます。

編集:valideer()がExceptionをスローしていると思われます。もう少し説明するために、コードを言い換えてみましょう。ルールを定義するとき、何が効果的にやっていることは以下の通りです:これはあなたの最初の呼び出しは()例外をスローvalideerする場合、制御は上記のcatchブロックに転送されることを意味し

try { 
    base.evaluate(); // this calls valideerWerkzaamMetGevaarlijkeStoffen() 
    Assert.fail("DomeinValidatieException not thrown"); 
} catch (DomeinValidatieException e) { 
    // evaluate whether or not the test has failed or not 
} 

。コントロールが他の場所を通過したため、テストを続行する機会はありません。あなたは好きなだけテストを合格/不合格にすることができますが、コントロールは上記のキャッチブロックに渡されています。

ところで、MethodRuleはそれ以降のバージョンでは廃止されましたが、代わりにTestRuleを使用する必要があります。

+0

Matthew、あなたは失敗の状況を説明します。もちろん、それは停止し、それは期待されています。しかし、最初のテストラインがOKであれば、2番目のテストラインはテストされません。 –

+0

解決策を編集して、何が起こっているのかを詳しく説明します。 –

+0

私はそれを得ると思います。もちろん、例外をスローして制御を渡します。だから私はエラーとして記録されないようにするために、返品のポイントを超えています。私はTestRuleを見ていきます。 –

0

デバッガを使用してコードを実行します。私の推測では、valideer()への最初の呼び出しは、あなたがそれを期待していなくても実際に例外をスローします。

+0

アーロン私はあなたが正しいと思います。期待どおりにDomeinValidatieExceptionをスローします。だからおそらく、最初のテスト可能なLoCだけを取るのです。今私は追加されたエラーを抑制する方法を見つける必要があります... –

+0

2つのテストに分割 –

関連する問題