web-dev-qa-db-ja.com

予想される例外をテストするJUnitの正しい方法

こんにちはみんな私は私の例外をテストするこの方法は大丈夫かどうか疑問に思っていました、私はあなたが推測できるように、2番目のテスト注釈をスローする必要があるこの例外があり、結果として赤い邪悪なバーと成功と失敗を受け取ります失敗は私の懸念です、私はfail()を持っています;そこにあるのは、例外をテストする方法を読んでいて、今混乱しているからです。

また、私はimが例外を期待しているので緑色のバーを取得する必要がありますが、失敗が期待される例外の答えを見る正しい方法であるかどうかはわかりません。

また、何かアドバイスがあれば、感謝します

@Before
    public void setUp() throws Exception {
        LogPack.logPacConfig(Constants.LOGGING_FILE);
        gtfri = "+RESP:GTFRI,380502,869606020101881,INCOFER-gv65,,10,1,1,0.0,0,888.1,-84.194560,9.955602,20170220074514,,,,,,0.0,,,,100,210100,,,,20170220074517,40A2$";
        weirdProtocol = "+RESP:GRI,380502,869606020101881,INCOFER-gv65,,10,1,1,0.0,0,888.1,-84.194560,9.955602,20170220074514,,,,,,0.0,,,,100,210100,,,,20170220074517,40A2$";
        factory = new LocomotiveFactory();
    }
    @Test
    public void GTFRICreationTester_shouldPass() throws TramaConProtolocoloDesconocido {
        assertTrue(factory.createLocomotive(gtfri, false, new Date()) instanceof LocomotiveGTFRI);
    }

    @Test(expected = TramaConProtolocoloDesconocido.class)
    public void GTFRICreationTester_shouldFail()  {
        try {
            factory.createLocomotive(weirdProtocol, false, new Date());
            fail("Expected an TramaConProtolocoloDesconocido");
        } catch (TramaConProtolocoloDesconocido e) {
            //assertSame("exception thrown as expected", "no se conoce el protocolo dado para la creacion de este factory", e.getMessage());;
        }
    }
16
Daniel Vega

予想される例外をテストする最も一般的な方法は3つあります。

最初の方法は最も一般的な方法ですが、それを使用して予期される例外のタイプのみをテストできます。 ExceptionTypeがスローされない場合、このテストは失敗します。

@Test(expected = ExceptionType.class)
public void testSomething(){
    sut.doSomething();
}

また、このアプローチを使用して失敗メッセージを指定することはできません

より良いオプションは ExpectedException JUnit @Rule を使用することです。ここでは、予想される例外に対してさらに多くをアサートできます

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

@Test
public void testSomething(){
    thrown.expect(ExceptionType.class);
    thrown.expectMessage("Error message");
    thrown.expectCause(is(new CauseOfExeption()));
    thrown.reportMissingExceptionWithMessage("Exception expected"); 
    //any other expectations
    sut.doSomething();
}

3番目のオプションでは、ExpectedException @Ruleを使用した場合と同じことができますが、すべてのアサーションは手動で記述する必要があります。ただし、この方法の利点は、任意のカスタムアサーションとアサーションライブラリを使用できることです。

@Test
public void testSomething(){
    try{
        sut.doSomething();
        fail("Expected exception");
    } catch(ExceptionType e) {
    //assert ExceptionType e
    } 
}
16
Sergii Bishyr

ExpectedException を使用すると、スローされると予想される例外に関するより正確な情報を提供でき、次のようにエラーメッセージを確認できます。

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
public class TestClass {

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


    @Test
    public void GTFRICreationTester_shouldFail()  {
        expectedException.expect(TramaConProtolocoloDesconocido.class);
        factory.createLocomotive(weirdProtocol, false, new Date());
    }
}

詳細については、私が書いたブログを参照してください- 期待される例外ルールとモック静的メソッド– JUnit

4
Arpit

Java 8を使用している場合、AssertJライブラリに行くことをお勧めします

public void GTFRICreationTester_shouldFail()  {
    assertThatExceptionOfType(EXCEPTION_CLASS).isThrownBy(() -> { factory.createLocomotive(weirdProtocol, false, new Date()) })
                                               .withMessage("MESSAGE")
                                               .withMessageContaining("MESSAGE_CONTAINING")
                                               .withNoCause();         

    }

そのソリューションを使用すると、メッセージなどで例外タイプを一度に確認できます.

詳細については、 http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion をご覧ください。

2
pezetem

_try-catch_でExceptionをキャッチする必要はありません

_@Test(expected = TramaConProtolocoloDesconocido.class)
public void GTFRICreationTester_shouldFail()  {

    factory.createLocomotive(weirdProtocol, false, new Date());

}
_

exceptionをスローするシナリオを適用すると、factory.createLocomotive(weirdProtocol, false, new Date())exceptionをスローすると仮定した場合。

_void createLocomotive(param...) {

    //something...

    throw new TramaConProtolocoloDesconocido();
}
_
1
Mouad EL Fakir