2011-12-20 8 views
4

私はXalanの使用のためにWeekConverterをテストしています。私のテストが正確に何をしているのか疑問に思っています。 :D以下の試験方法持つ例外予想(複数のアサート)を伴うJUnitテスト

@Test(expected = IllegalArgumentException.class) 
    public void testConvertTwoDigitYearWithWrongInput() { 
    WeekConverter weekConverter = new WeekConverter(WeekConverter.Strategy.TWO_DIGIT_YEAR); 

    //wrong or empty inputs 
    assertEquals("0", weekConverter.convert("")); 
    assertEquals("0", weekConverter.convert("abcdefgh")); 
} 

このテストは、すべての例外を主張する、または最初のassertのために期待していますか?最初のものだけであれば、どちらの場合でも同じ例外が予想されますが、各アサートのテストメソッドを作成する必要があります。誰かが私の例をここで確認できますか?

私もNullPointerExceptionがを得ヌルためのテストを、持っています。 2アサートとはIllegalArgumentExceptionを期待

if (inputDate == null) { 
    do something and throw NullPointerexception 
} else if (inputDate.isEmpty()) { 
    do something and throw IllegalArgumentException, since inputDate is not really null 
} else if (inputDate.matches(regex)) { 
    go futher and convert 
} else { 
    do something and throw IllegalArgumentException, since inputDate does not match regex 
} 

したがって一つの試験方法:ソフト検証は以下です。しかし、JUnitの機能性を尊重するだけでなく、2つの異なる州からのスローを期待するという2つの異なるテスト方法が必要であることは明らかです。

+0

あなたは例外を期待しているので、あなたはアサートが等しくなる必要はありません - あなたが必要とするすべては、変換するための呼び出しです。 – avandeursen

答えて

3

メソッドを複数のメソッドに分割することはできますが、入力サンプルが多数ある場合は不便です。

あなたは代わりに以下の方法を使用することができます。

@Test 
public void testConvertTwoDigitYearWithWrongInput() { 
    WeekConverter weekConverter = new WeekConverter(WeekConverter.Strategy.TWO_DIGIT_YEAR); 

    assertFailsToConvert(weekConverter, ""); 
    assertFailsToConvert(weekConverter, "abcdefgh"); 
} 

private void assertFailsToConvert(WeekConverter weekConverter, String input) { 
    try { 
     weekConverter.convert(input); 
     fail("Should not convert [" + input + "]"); 
    } catch (IllegalArgumentException ex) {} 
} 
+0

この問題は、テストを見なくてもテストが自己文書化されなくなり、ASTや推測がなくても人間が判読可能な形式でドキュメント化できなくなることです。それらを別々に保つことで、はるかに優れた情報を生成できます。 –

+0

excactly(コメント) –

+1

しかし、異なる入力サンプルに対して多数の別々のテストを行うと、読みやすさと保守性が損なわれ、より重要なものを決定する必要があります。 – axtavt

1

複数のテスト方法を用意する必要があります。異なるテスト方法です。

例外は、コンバータが最初に無効な引数を取得したときにスローされます。

また、文書の振る舞いにだけ、ヌル入力をテストする必要があります。

+0

これは良い点です...特に同じ例外をスローするときではなく、異なる状態からスローするときです。 –

1

このテストでは、スローされている場所や理由にかかわらず、IllegalArgumentExceptionがスローされていることが予期されています。

2つのテストで分割することをお勧めします。

1

をあなたは別の@Before設定方法に変換治具の作成を置くことができ、その後、あなたがに対処するための(3)独立したテストケースを持つことができますnull、 ""、 "abcdef"のいずれかです。

さらに多くのケースがテストされる場合、 JUnitできちんとした方法は、@Parameters注釈と対応するランナーを使用することです。

あなたのテストクラスでは、2桁の間違った年しか扱われません。そのコンストラクタは、inputDate String型でパラメータ化されます。

@Parametersを生成する静的メソッドは、""abcdefg(その他の面白いケース)を含むコレクションを返します。

単一のテストケースでは、IllegalArgumentExceptionが必要です。

@RunWith(Parameterized.class) 
public class IncorrectTwoDigitYears { 
    String inputDate; 

    public IncorrectTwoDigitYears(String inputDate) { 
     this.inputDate = inputDate; 
    } 

    @Test(expected = IllegalArgumentException.class) 
    public void testFormat() { 
     (new WeekConverter(WeekConverter.Strategy.TWO_DIGIT_YEAR)) 
      .convert(inputDate); 
    } 

    @Parameters 
    public static Collection<Object[]> data() { 
     Object[][] data = new Object[][] { 
      { "" }, { "abcdef" }, { "0" }, { "000" }, { "##" } }; 
     return Arrays.asList(data); 
    } 
} 

テストするケースが2つ以上ある場合は、支払いが高くなります。

1

catch-exceptionをお試しください:

@Test 
public void testConvertTwoDigitYearWithWrongInput() { 

    WeekConverter weekConverter = ... 

    // wrong or empty inputs 
    verifyException(weekConverter, IllegalArgumentException.class) 
     .convert(""); 
    verifyException(weekConverter, IllegalArgumentException.class) 
     .convert("abcdefgh"); 
} 
関連する問題