2013-09-25 21 views
8

は、私は、整数値を取得します:valが3に等しいかのいずれかでOKである5に等しいいずれかの場合JUnitのアサートOR条件私のテストケースで

int val = getXXX(); 

その後、私はチェックしたいと思います場合。だから、私はやった:

assertTrue(val == 3 || val==5); 

私は私のテストを実行し、ログがvalは5ですが、私の上のアサーションコードがAssertionFailedErrorで失敗しました表示されます。このようにしてassertTrue(...)を使用することはできないようですが、次にOR条件が真であるかどうかを確認する方法はありますか?

+2

デバッグおよびその権利 'assertTrue'文の前に' val'の値を調べる:IMOも読みやすいです - そして、あなたは値がリスト内に存在することを確認するためにcontainsメソッドを使用することができます。それはまだ5ですか? – chrylis

答えて

7

IVEは、簡単なテストを書き込もうとしました:

@Test 
public void testName() { 
    int i = 5; 
    junit.framework.Assert.assertTrue(i == 3 || i == 5); 

} 

その通過いつも私はあなたの値が変更され、いくつか挟んコードがあると思います。 あなたは値をチェックする

org.junit.Assert.assertEquals(5, i); 

を使用することができます - いただきました!間違ってこの主張は、たとえば、素敵な情報を出力します:

java.lang.AssertionError: 
Expected :4 
Actual :5 
23

あなたがここに明確にエラーメッセージを取得するためにHamcrest matchersを使用することができます。

int i = 2; 
assertThat(i, Matchers.either(Matchers.is(3)).or(Matchers.is(5)) 

or 

int i = 2; 
assertThat(i, Matchers.anyOf(Matchers.is(3),Matchers.is(5))); 

このことは、より明確に説明されます。

Expected: (is <3> or is <5>) 
    but: was <2> 

は、提供された期待値と誤った値を正確に示しています。

+0

これを動作させるには、hamcrest-libraryへの依存性を含める必要があります。 JUnitは、Matchersクラスを含まないhamcrest-coreだけに依存します。 – toongeorges

2

Harmcrestのマッチャーは仕事をすることができますが、これらの定数は有効な値のリストのようなより意味のある定数に簡単にリファクタリングできます。テスト

public class Foo { 
    public static final List<Integer> VALID_VALUES = Arrays.asList(3, 5); 
} 

@Test 
public void testName() { 
    int i = 5; 
    Assert.assertTrue(Foo.VALID_VALUES.contains(i)); 
} 
+0

テストケースごとに定数を定義する必要があります。私はこれが2つのテストケースを超えて妥当だとは思わない。これらの定数は、使用される場所から離れている可能性があります。別の可読性の問題: 'Foo.VALID_VALUES.contains(i)'はHarmcrest matcherのアプローチよりもあまり明確ではありません。 Harmcrestはまた、これよりもはるかに優れた、containsを持つ正規表現を提供します。 – garci560

関連する問題