私は他の誰かが書いたコードでJUnitテストをしようとしていますが、例外には型が欠けているように見えるので、例外をテストする方法を理解できません。
public Pirate(String name, int initialGold) throws Exception {
if(initialGold < 0)
throw new Exception("Init Gold must be >= 0");
this.name = name;
this.numGold = initialGold;
this.health = Pirate.DEFAULT_HEALTH;
this.isCursed = false;
}
私のJUnitコードスニペット:
@Test
public static void constructorTest() throws Exception{
rodgers = new Pirate("Dread Pirate Rodgers", 10000);
assertEquals("Dread Pirate Rodgers" , rodgers.getName());
assertEquals(10000, rodgers.getNumGold());
assertEquals(100, rodgers.getHealth());
assertEquals(false, rodgers.getIsCursed());
}
@Test()
public static void exceptionTest() throws Exception{
rodgers = new Pirate("Dread Pirate Rodgers" , -100);
}
Testの括弧にexpected =(ある種の例外)を入れる必要があることは知っていますが、例外の種類についてはわかりません。
Rule
と ExpectedException
を使用して、JUnit 4.7の@Test(expected=Xyz.class)
に代わるものが実際にあります
テストケースでは、_@Rule
_アノテーションが付けられたExpectedException
を宣言し、ExpectedException.none()
のデフォルト値を割り当てます。次に、例外を予期するテストで、値を実際の期待値に置き換えます。これの利点は、いtry/catchメソッドを使用せずに、例外内のメッセージが何であったかをさらに指定できることです。
_@Rule public ExpectedException thrown= ExpectedException.none();
@Test
public void myTest() {
thrown.expect( Exception.class );
thrown.expectMessage("Init Gold must be >= 0");
rodgers = new Pirate("Dread Pirate Rodgers" , -100);
}
_
このメソッドを使用すると、一般的な例外のメッセージが特定のものであるかどうかをテストできる場合があります。
[〜#〜] addition [〜#〜]ExpectedException
を使用するもう1つの利点は、例外内の例外をより正確にスコープできることです。テストケースのコンテキスト。テストで@Test(expected=Xyz.class)
アノテーションのみを使用している場合、Xyz例外は、テストコード内の任意の場所(テストメソッド内のテストセットアップまたは事前アサートを含む)にスローできます。これにより、誤検知が発生する可能性があります。
ExpectedExceptionを使用すると、テスト中のメソッドを実際に呼び出す直前に、セットアップと事前アサートが完了するまでthrown.expect(Xyz.class)
の指定を延期できます。したがって、テストフィクスチャ自体ではなく、実際のメソッド呼び出しによってスローされる例外をより正確にスコープします。
JUnit 5注:
JUnit 5 JUnit Jupiterは、@Test(expected=...)
、_@Rule
_、およびExpectedException
をすべて削除しました。これらは新しい assertThrows()
に置き換えられ、Java 8およびラムダ構文を使用する必要があります。ExpectedException
は引き続き使用可能です。また、JUnit Jupiterは、 junit-jupiter-migrationsupport module を使用してJUnit 4 ExpectedException
を引き続きサポートしますが、追加する場合のみ _@EnableRuleMigrationSupport
_ のクラスレベルの注釈。
expectedを@ Testアノテーションorは、明示的なcatchブロックを提供し、プログラムフローが期待どおりでない場合、failを発行します。
@Test(expected=Exception.class) // Java.lang.Exception
public static void exceptionTest() throws Exception {
rodgers = new Pirate("Dread Pirate Rodgers" , -100);
}
@Test
public static void exceptionTest() throws Exception {
try {
rodgers = new Pirate("Dread Pirate Rodgers" , -100);
fail("should not reach this");
} catch(Exception e) {
// ok
}
}
私の個人的な好みが最初の解決策です。
JUnit 'expected'を使用して、例外をテストできます。
@Test(expected = ExceptionYouWishToTestFor.class)
public void divisionWithException() {
// Test Code
}
その後、コードで特定の例外をスローするかどうかはあなた次第です。
金がゼロ以上でない場合、Exception
をスローしません。 IllegalArgumentException
をスローします。確かに、あなたのPirate
がマイナスの金を持っていることは違法であるように聞こえます。
public Pirate(String name, int initialGold) {
if(initialGold < 0)
throw new IllegalArgumentException("Init Gold must be >= 0");
次に、JUnitテストケースで、IllegalArgumentException
を期待します。
@Test(expected=IllegalArgumentException.class)
public static void exceptionTest() {