23

JUnit4 では、1 つのメソッドでパラメーター コレクションを提供することにより、パラメーター化された単体テストを記述できます。これは、テストのコンストラクターに渡され、別のメソッドでテストされます。例外がスローされることが予想されるパラメーターがある場合、どのように指定すればよいですか?

4

7 に答える 7

30

これは、予想される例外でjunitパラメータ化テストを使用する方法です:

@RunWith(Parameterized.class)
public class CalcDivTest {

@Parameter(0)
public int num1;
@Parameter(1)
public int num2;

@Parameter(2)
public int expectedResult;

@Parameter(3)
public Class<? extends Exception> expectedException;
@Parameter(4)
public String expectedExceptionMsg;

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

@Parameters
public static Iterable<Object[]> data() {
    return Arrays.asList(new Object[][] {
        // calculation scenarios:
        { 120, 10, 12, null, null }, // simple div  
        { 120, 0, -1, ArithmeticException.class, "/ by zero" }, // div by zero          
    });

}

@Test
public void testDiv() throws CCalculationException {

    //setup expected exception
    if (expectedException != null) {
        thrown.expect(expectedException);
        thrown.expectMessage(expectedExceptionMsg);
    }

    assertEquals("calculation result is not as", expectedResult, div(num1, num2) );

}

private int div(int a, int b) {
    return a/b;
}
}
于 2016-03-27T13:13:10.100 に答える
8

他の提案とは対照的に、私はテストにいかなる種類のロジックも導入しません - 単純な if でさえも!

必要なのは、2 つのテスト方法です。

  • 最初のものは有効なパラメーターを受け取ります (そして、いくつかの出力を期待します)
  • 2 番目は無効なパラメーターを受け取ります (例外が予想されます)

コンストラクターベースのパラメーター化されたテストを使用する JUnit がこれを実行できるかどうかはわかりません。おそらく、これには 2 つのテスト クラスを作成する必要があります。はるかに便利なソリューションを提供する JUnit Params または TestNG を使用してください。

于 2012-09-20T18:48:55.523 に答える
5
if (parameter == EXCEPTION_EXPECTED) {
    try {
        method(parameter);
        fail("didn't throw an exception!");
    } catch (ExpectedException ee) {
        // Test succeded!
    }
}
于 2010-11-11T08:33:37.280 に答える
0

JUnit4 の対応するアノテーションとルールの代わりにcatch-exceptionを使用した場合、コードは次のようになります。

catchException(obj).method(parameter);

if (parameter != EXCEPTION_EXPECTED) {
    assert caughtException() instanceof ExpectedException;
}
// more assertions
于 2012-06-22T17:26:33.857 に答える
0
@Test(expected = Exception.class)
@Parameters(value = { "invalidInput1", "invalidInput2" })
public void shouldThrowOnInvalidInput(String input) {
    ClassToTest.methodToTest(input);
}

junitparamsライブラリの junitparams.Parameters を使用します。

于 2020-07-14T09:06:59.233 に答える