ここでの回答のほとんどはかなり時代遅れなので、この質問には更新された回答が必要だと思います。
まず、OPの質問に:
「期待される例外」の概念をJUnitに導入することは、その例外がどこでも発生する可能性があり、テストに合格するため、悪い動きであったことはかなり受け入れられていると思います。非常にドメイン固有の例外をスロー(およびアサート)する場合は機能しますが、完全に完全である必要があるコードで作業している場合にのみ、これらの種類の例外をスローします-ほとんどのAPISは、IllegalArgumentException
またはのような組み込みの例外を単にスローしますIllegalStateException
。2回の呼び出しでこれらの例外が発生する可能性がある場合は、@ExpectedException
場合、例外をスローする行が間違っていてもアノテーションによってテストが緑色で表示されます。
この状況のために、私はここにいる他の多くの人が書いたと確信しているクラスを書きました。それはassertThrows
メソッドです。
public class Exceptions {
private Exceptions(){}
public static void assertThrows(Class<? extends Exception> expectedException, Runnable actionThatShouldThrow){
try{
actionThatShouldThrow.run();
fail("expected action to throw " + expectedException.getSimpleName() + " but it did not.");
}
catch(Exception e){
if ( ! expectedException.isInstance(e)) {
throw e;
}
}
}
}
このメソッドは、例外がスローされた場合に単に返されるため、テストでさらにアサーション/検証を行うことができます。
Java 8構文を使用すると、テストは非常に見栄えがします。以下は、このメソッドを使用するモデルでのより簡単なテストの1つです。
@Test
public void when_input_lower_bound_is_greater_than_upper_bound_axis_should_throw_illegal_arg() {
AxisRange range = new AxisRange(0,100);
Runnable act = () -> range.setLowerBound(200);
assertThrows(IllegalArgumentException.class, act);
}
「act」ステップは実際にはアクションを実行しないため、これらのテストは少し不安定ですが、意味はまだかなり明確だと思います。
mavenにはcatch-exceptionと呼ばれる小さなライブラリもあり、mockitoスタイルの構文を使用して例外がスローされることを確認します。見た目はきれいですが、私は動的プロキシのファンではありません。とは言うものの、構文が非常に洗練されているため、魅力的なままです。
List myList = new ArrayList();
catchException(myList).get(1);
assert caughtException() instanceof IndexOutOfBoundsException;
最後に、私がこのスレッドにたどり着くために遭遇した状況については、無視する方法があります何らかの条件が満たされた場合にテストます。
現在、JNAと呼ばれるjava native-library-loading-libraryを介して呼び出されるDLLの取得に取り組んでいますが、ビルドサーバーはubuntuにあります。私は、JUnitテストを使用してこの種の開発を推進しようとしていますが、現時点では「ユニット」からはほど遠いです。私がやりたいのは、ローカルマシンを使用している場合はテストを実行することですが、ubuntuを使用している場合はテストを無視します。JUnit 4には、次のような機能がありAssume
ます。
@Test
public void when_asking_JNA_to_load_a_dll() throws URISyntaxException {
Assume.assumeFalse(BootstrappingUtilities.isCircleCI());
URL url = DLLTestFixture.class.getResource("USERDLL.dll");
String path = url.toURI().getPath();
path = path.substring(0, path.lastIndexOf("/"));
NativeLibrary.addSearchPath("USERDLL", path);
Object dll = Native.loadLibrary("USERDLL", NativeCallbacks.EmptyInterface.class);
assertThat(dll).isNotNull();
}