362

@Testアノテーションを使用していくつかの JUnit テストを作成しました。テスト メソッドがチェック例外をスローし、例外と共にメッセージをアサートしたい場合、JUnit@Testアノテーションを使用してアサートする方法はありますか? 私の知る限り、JUnit 4.7 はこの機能を提供していませんが、将来のバージョンでは提供されますか? .NET では、メッセージと例外クラスをアサートできることを知っています。Javaの世界で同様の機能を探しています。

これは私が欲しいものです:

@Test (expected = RuntimeException.class, message = "Employee ID is null")
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() {}
4

12 に答える 12

570

@Rule次のように、注釈をで使用できますExpectedException

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

@Test
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() throws Exception {
    expectedEx.expect(RuntimeException.class);
    expectedEx.expectMessage("Employee ID is null");

    // do something that should throw the exception...
    System.out.println("=======Starting Exception process=======");
    throw new NullPointerException("Employee ID is null");
}

ドキュメントの例ExpectedExceptionは (現在) 間違っていることに注意してください。パブリック コンストラクターがないため、 を使用する必要がありますExpectedException.none()

于 2011-06-29T22:26:07.977 に答える
36

使用する必要があります@Test(expected=SomeException.class)か? 例外の実際のメッセージをアサートする必要がある場合、これが私たちが行うことです。

@Test
public void myTestMethod()
{
  try
  {
    final Integer employeeId = null;
    new Employee(employeeId);
    fail("Should have thrown SomeException but did not!");
  }
  catch( final SomeException e )
  {
    final String msg = "Employee ID is null";
    assertEquals(msg, e.getMessage());
  }
}
于 2010-03-19T21:53:07.063 に答える
12

実際には、try/catch を使用するのが最適です。なんで?例外が予想される場所を制御できるためです。

次の例を検討してください。

@Test (expected = RuntimeException.class)
public void someTest() {
   // test preparation
   // actual test
}

ある日、コードが変更され、テストの準備で RuntimeException がスローされた場合はどうなるでしょうか? その場合、実際のテストはテストさえされず、例外がスローされなくてもテストはパスします。

そのため、アノテーションに依存するよりも、try/catch を使用する方がはるかに優れています。

于 2015-08-18T09:18:24.573 に答える
2

@Rule を使用する場合、例外セットは Test クラスのすべてのテスト メソッドに適用されます。

于 2014-09-26T10:13:14.023 に答える