15

jUnit で例外をチェックするコードがあります。次のうちどれが jUnit の良いプラクティスか知りたいですか?

初め

@Rule
public ExpectedException exception = ExpectedException.none();

@Test
public void checkNullObject() throws CustomException {
    exception.expect(CustomException.class);
    MyClass myClass= null;
    MyCustomClass.get(null);
}

2番

@Test(expected=CustomException.class)
public void checkNullObject() throws CustomException {
    MyClass myClass= null;
    MyCustomClass.get(null);    
}

編集: CustomException は未チェックのカスタム例外であることに注意してください。(ただし、この質問には何の影響もありません)。

4

2 に答える 2

19

例外で何をチェックしたいかによって異なります。例外がスローされたことを確認するだけの場合は、@Test(expected=...)おそらく次の方法を使用するのが最も簡単な方法です。

@Test(expected=CustomException.class)
public void checkNullObject() throws CustomException {
  MyClass myClass= null;
  MyCustomClass.get(null);
}

ただし、 @Rule ExpectedException には、 javadocからのメッセージのチェックなど、さらに多くのオプションがあります。

// These tests all pass.
public static class HasExpectedException {
    @Rule
    public ExpectedException thrown= ExpectedException.none();

    @Test
    public void throwsNothing() {
        // no exception expected, none thrown: passes.
    }

    @Test
    public void throwsNullPointerException() {
        thrown.expect(NullPointerException.class);
        throw new NullPointerException();
    }

    @Test
    public void throwsNullPointerExceptionWithMessage() {
        thrown.expect(NullPointerException.class);
        thrown.expectMessage("happened?");
        thrown.expectMessage(startsWith("What"));
        throw new NullPointerException("What happened?");
    }

    @Test
    public void throwsIllegalArgumentExceptionWithMessageAndCause() {
        NullPointerException expectedCause = new NullPointerException();
        thrown.expect(IllegalArgumentException.class);
        thrown.expectMessage("What");
        thrown.expectCause(is(expectedCause));
        throw new IllegalArgumentException("What happened?", cause);
    }
}

したがって、例外の元の原因であるメッセージを確認できます。メッセージのチェックにはマッチャーが使えるので、チェックなどを行うことができますstartsWith()

古いスタイル (Junit 3) の throw/catch を使用する理由の 1 つは、特定の要件がある場合です。これらの多くはありませんが、発生する可能性があります。

@Test
public void testMe() {
    try {
        Integer.parseInt("foobar");
        fail("expected Exception here");
    } catch (Exception e) {
        // OK
    }
}
于 2012-07-11T09:25:27.893 に答える