web-dev-qa-db-ja.com

Junit assert ORテストケースの条件

私のテストケースでは、整数値を取得します:

_int val = getXXX();
_

次に、valが3に等しいか、5に等しいかを確認したいので、どちらの場合でもOKです。だから、私はやった:

_assertTrue(val == 3 || val==5);
_

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

21
Leem.fin

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
16
smajlo

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>

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

38
Joe

Harmcrestマッチャーはその役割を果たしますが、これらの定数は、有効な値のリストなど、より意味のある定数に簡単にリファクタリングできます。次に、containsメソッドを使用して、値がリストに存在することを確認できます-IMOも読みやすいです:

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));
}
3
A. Rodas

私の場合、複雑なアサーションロジックを実行したかったので、ブール値を返すメソッドを実装してジョブを実行しました。この例での実装方法は次のとおりです。

private Boolean is3or5(Integer val) {
    if(val == 3 || val == 5) {
        return true;
    }
    return false;
}

次に、アサーションを実行します。

assertTrue(is3or5(val));

もちろん、必要に応じてメソッドにはより複雑なロジックを含めることができます

1
Mis94