Junit在我的测试用例中断言OR条件

时间:2013-09-25 12:14:00

标签: java unit-testing junit junit4 junit3

在我的测试用例中,我得到一个整数值:

int val = getXXX();

然后,我想检查val是等于3还是等于5,这两种情况都可以。所以,我做了:

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

我运行测试,日志显示val为5,但我的上述断言代码因 AssertionFailedError 而失败。似乎我不能以这种方式使用assertTrue(...),那么,如何检查OR条件是否为真?

4 个答案:

答案 0 :(得分:37)

您可以使用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>

准确显示期望值和提供的错误值。

答案 1 :(得分:13)

我试着写快速测试:

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

}

它的传递总是如此,我想当你的值改变时,有一些inbetween代码。 你可以使用

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

检查值 - 这个断言会打印出错误的错误信息,例如:

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

答案 2 :(得分:2)

虽然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 :(得分:1)

在我的情况下,我想执行一些复杂的断言逻辑,因此我仅实现了一个返回布尔值的方法并完成了工作,在本示例中,该方法的实现方式如下:

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

然后执行断言:

assertTrue(is3or5(val));

当然,如果需要,该方法可以包含更复杂的逻辑