Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的测试用例中的Junit断言或条件_Java_Unit Testing_Junit_Junit4_Junit3 - Fatal编程技术网

Java 我的测试用例中的Junit断言或条件

Java 我的测试用例中的Junit断言或条件,java,unit-testing,junit,junit4,junit3,Java,Unit Testing,Junit,Junit4,Junit3,在我的测试用例中,我得到一个整数值: int val = getXXX(); 然后,我想检查val是否等于3或等于5,这两种情况都可以。所以,我做到了: assertTrue(val == 3 || val==5); 我运行了我的测试,日志显示val是5,但是我上面的断言代码失败了AssertionFailedError。似乎我不能用这种方式使用assertTrue(…),那么,如何检查true或条件?我尝试编写快速测试: @Test public void testName() {

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

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

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

我运行了我的测试,日志显示
val
是5,但是我上面的断言代码失败了AssertionFailedError。似乎我不能用这种方式使用assertTrue(…),那么,如何检查true或条件?

我尝试编写快速测试:

@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
您可以使用此处获得更清晰的错误消息:

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>
应为:(是或是)
但是:是吗

准确显示期望值和提供的不正确值。

虽然Harmcrest matchers可以完成这项工作,但这些常量可以很容易地重构为更重要的常量,如有效值列表。然后,您可以使用
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));
}
公共类Foo{
公共静态最终列表有效值=数组.asList(3,5);
}
@试验
public void testName(){
int i=5;
Assert.assertTrue(Foo.VALID_VALUES.contains(i));
}

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

private Boolean is3or5(Integer val) {
    if(val == 3 || val == 5) {
        return true;
    }
    return false;
}
然后执行断言:

assertTrue(is3or5(val));

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

调试测试,并在
assertTrue
语句之前检查
val
的值。它仍然是5吗?要使其工作,必须包含对hamcrest库的依赖。JUnit仅依赖于hamcrest core,它不包括Matchers类。对于hamcrest库中没有
Matchers
类的用户,您可以使用
org.hamcrest.CoreMatchers
。答案中的示例如下:
assertThat(i,CoreMatchers.is(3))或(CoreMatchers.is(5))
您需要为每个测试用例定义一个常量;我认为这在几个测试用例之外是不合理的。这些常量可能会远离它们的使用位置。另一个可读性问题:
Foo.VALID\u VALUES.contains(I)
不如Harmcrest matchers的方法清晰。Harmcrest还提供了一个包含内容的matcher,这也比这要好得多。Hamcrest版本要好得多,因为它会在失败时打印观察到的值。没有什么比从一个长CI构建返回测试失败更烦人的了,它只是说“假的不是真的”。