3

処理の特定の時点で、特定の不変条件が保持されることを期待する方法があります。
この些細なことを保つために、コード処理中のポイント X で、変数highと変数lowが割り切れなければならないとしましょう。
だから私が行うコードでは:

if(high % low != 0){  
  throw new AssertionError("Invalid state of low and high [low = "+ low+ ", high=" + high+"]");   
}   

単体テスト中JUnitsに、これをテストするテストケースがありました。
だから私はした:

try {
//At this point I know for sure that the low and high are not divible so process() should throw an Assertion Error
   process();  
   fail();  
} 
catch(AssertionError e){        
}

しかし、テストケースは緑色でした!
しかし、junitが原因でアサートエラーが発生することに気付きましたfailが、それをキャッチした結果、テストケースは失敗ではなく合格になりました。
私の観点からすると、私のコードで発生させる適切なエラーもAssertionError一般的なものではありません。たとえば、テストケースが機能するようにこれを修正する方法はありますか、それとも最初からコードでIllegalArgumentsException
使用すべきではありませんか? AssertionErrorこの場合、どの例外を発生させる必要がありますか?

4

4 に答える 4

2

try-catch単体テストにはブロックを含めないでください。例外が予想される場合は、注釈を使用します。

@Test(expected=Exception.class)
public void youTestMethod() {
   ...
}

IllegalArgumentsExceptionJUnit がAssertionError内部的に使用するためなど、別の例外を使用する必要があります。IllegalArgumentsException実際に何がうまくいかなかったのかについて、より説明的です。

于 2012-05-05T14:10:36.280 に答える
1
boolean shouldFail = false;
try {
    callTheMethod();
    shouldFail = true;
}
catch (AssertionError e) {
    // expected
}
if (shouldFail) {
    fail();
}

しかし、条件が不変である場合、それは常に true である必要があり、AssertionError がスローされることはありません。したがって、単体テストを実行することさえできません。テストできる場合、不変条件は実際には不変条件ではなく、呼び出しのシーケンスまたは提供された引数に応じて条件が真になる可能性があることを意味します。したがって、AssertionError よりも IllegalStateExcetion を優先する必要があります。

于 2012-05-05T14:12:07.687 に答える
0

はい、コードと JUnit の間に競合がありますが、回避するのは簡単です。

JUnit テスト ケースを作成すると、既に推測したように、テスト ケースが失敗すると AssertionError がスローされます。

テスト ケースが合格したことを JUnit に知らせるために、テスト コードは、他の例外/エラーで AssertionError をスローしてはなりません。

(少なくとも) 2 つのテスト ケースがあります -

A. 高低は正確に割り切れます。テスト ケース コードは AssertionError をスローしません。

//test case setup
yourClass.callYourMethod(4,2);
//verification

ここで、テスト ケースが正しく動作する場合、AssertionError は発生せず、JUnit は合格したことを認識します。

B. 高い値と低い値が正確に割り切れない - コードは AssertionError をスローする必要がありますが、テスト ケースはそうすべきではありません。

boolean failed;
try {
    //test case setup
    yourClass.callYourMethod(4,2);
    failed = true;
} catch (AssertionError e) {
    failed = false;
}
if (failed) {
    fail();
}
于 2012-05-05T14:21:09.520 に答える
0
 > should I not be using the AssertionError in my code in the first place? 

テストが失敗したことを junit-runner に伝えるために AssertionError とその子孫を使用している JUnit はありません。(同様のことが .net NUnit-runner にも当てはまります)

 > If this is the case, what exception should I be raising? 

一般的な Exceptionoin のいずれかを使用IllegalArgumentsExceptionするか、独自の例外を作成します

于 2012-05-05T14:14:31.453 に答える