32

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

int val = getXXX();

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

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

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

4

4 回答 4

51

您可以使用Hamcrest 匹配器在此处获得更清晰的错误消息:

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>

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

于 2013-09-28T07:22:02.733 回答
24

我试图编写快速测试:

@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
于 2013-09-25T12:22:26.687 回答
5

虽然 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));
}
于 2015-01-15T11:40:55.633 回答
2

在我的例子中,我想做一些复杂的断言逻辑,所以我简单地实现了一个返回布尔值的方法,它完成了这项工作,在这个例子中它的实现方式如下:

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

然后做断言:

assertTrue(is3or5(val));

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

于 2018-11-22T14:07:16.193 回答