私は、処理の特定の時点で一定の不変量が保持されることを期待する方法があります。
コード処理中のポイントXで、変数high
と変数low
が割り切れる必要があります。
だからコードで私が行いますJUnitを使用する場合、AssertionErrorsは禁止されていますか?
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
を使用しないでください。このような場合は、どのような例外を提起する必要がありますか?
+1。私は不変量に関する議論に従わない。あなたは本当に提供された議論(しかし、間接的に、 ''高 ''と低 ''が引き渡された引数から導出されます)に依存しています、そして、常に高値と低値が割り切れるべきであるという事実は、これは不変量としてそれらを構成しないのですか? – Cratylus
不変量は、クラス自体によって常に真であることが保証されているブール条件です。提供された引数が正しい場合にのみこの条件が満たされる場合、それはもはや不変式ではありません。それを不変にする方法は、不変条件を偽にするなら、引数を拒否することです。不正な引数を拒否するには、IllegalArgumentExceptionをスローします。例えば、Personクラスは、「年齢> 0」のようにivariantを持つことができます。 setAge(int age)メソッドは、年齢が<= 0の場合にIllegalArgumentExceptionをスローすることでこの不変量を保証する必要があります。 –
これは良い解決策です。ここには2つの選択肢があります:(#1)AssertionErrorの代わりに別の例外を投げます。必要に応じて、独自の例外クラスを作成します。 (#2)私はブロックをキャッチする例外メッセージintを最もよくチェックします:assertEquals( "低および高[低= 2、高= 11]の無効な状態"、e.getMessage()) –