2013-09-25 16 views
8

在我的测试情况下,我得到一个整数值:Junit的断言或条件在我的情况

int val = getXXX(); 

然后,我想检查是否val或者等于3或等于5这是确定在任案件。所以,我所做的:

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

我跑我的测试,日志显示val是5,但我的上述论断的代码失败,AssertionFailedError异常。似乎我不能以这种方式使用assertTrue(...),那么,如何检查OR条件是否正确?

+2

调试测试和'assertTrue'语句之前检查val'的'值。它仍然是5吗? – chrylis

回答

7

香港专业教育学院尝试写简单的测试:

@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仅依赖于hamcrest-core,它不包含Matchers类。 – toongeorges

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)); 
} 
+0

您需要为每个测试用例定义一个常量;除了几个测试用例之外,我认为这是不合理的。这些常量可能远离他们使用的地方。另一个可读性问题:'Foo.VALID_VALUES.contains(i)'不如Harmcrest匹配器的方法清晰。 012mHarmcrest还提供了包含的匹配器,这也比这更好。 – garci560