2013-09-25 4 views
8

, 나는 정수 값을 얻을 : val은 3과 같거나에 괜찮 5와 동일하거나 경우의 JUnit 어설 OR 조건을 내 테스트 경우

int val = getXXX(); 

를, 내가 확인하고 싶은 중 케이스. 그래서 내가 그랬어 :

내 테스트를 실행
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); 

} 

의 통과는 항상 내가 당신의 값이 변경되는 일부 inbetween 코드가 같아요. 당신은

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은 Matchers 클래스를 포함하지 않는 hamcrest-core에만 의존합니다. – toongeorges

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

각 테스트 케이스마다 상수를 정의해야합니다. 나는 이것이 몇 가지 테스트 케이스를 넘어 합리적이라고 생각하지 않는다. 이러한 상수는 잠재적으로 그들이 사용되는 장소에서 멀리 떨어져있을 것입니다. 또 다른 가독성 문제 :'Foo.VALID_VALUES.contains (i)'는 Harmcrest matchers의 접근법보다 덜 명확합니다. Harmcrest는 또한 contains와 함께 matcher를 제공하는데 이것보다 훨씬 더 낫습니다. – garci560