2013-03-22 5 views
1

JUnit4에서 assumeThat의 오류 메시지를 어떻게 볼 수 있습니까?JUnit4 : assumThat 메시지가 출력되지 않습니다

이 테스트는 통과하지만 아무 것도 인쇄하지 않습니다. 그 이유는 read1에서 테스트를 수행하려면 btrue이되어야하기 때문입니다. bfalse이므로 테스트가 적용되지 않습니다.

boolean b = false; 
byte[] read1 = null; 
assumeThat("b shold be true to continue testing", b, is(true)); 
assertThat("read1 should not be null", read1, is(notNullValue())); 

assumeThat 메시지와 관련된 로그를 찾지 못했습니다. 내 문제는 가정 X가 실패했기 때문에 어떤 테스트가 통과되었지만 완료되지 않았는지 알고 싶습니다. 메시지 (예를 들어 어설 션이 실패 할 때와 유사)가 여전히 가정을 위해 인쇄 되었다면 좋을 것입니다.

이상하게 보일 수도 있지만 JUnit 페이지를 포함하여이 문제에 대한 의견을 찾을 수 없었습니다. 그래서 내가 잘못된 일을하거나 잘못된 장소에서 메시지를 찾는 것입니다. 나는 Eclipe를 사용하고있다.

답변

0

내가 제대로 이해하면

assertThat("read1 should not be null", read1, is(notNullValue())); 

b == true 경우 실행해야하지만 b == false 경우 오류가 아니다 ? 그런 다음

왜 당신은 간단하지 않습니다

if(b) { 
    assertThat("read1 should not be null", read1, is(notNullValue())); 
} else { 
    log.warn("b == false, Test on read1 skipped"); 
} 

? 아니면 특별한 테스트 결과 상태 ("성공하지만 의심스러운"상태)를 원하십니까?

업데이트 : 방금 가정 할 때 문서를 다시 읽었습니다. 가정이 실패하면 전체 시험은 "의미가 없다"고 간주되고 "무시 됨"으로 표시됩니다. 일반적으로 필요한 모든 정보를 제공하는 작고 집중된 테스트를 통해

업데이트 2 : 이클립스에서 JUnit 4.8을 사용해 보았습니다. 4.2 여기에 있습니다. 그것은 시험을 성공적으로 마킹합니다. 그래서 Eclipse의 JUnit 러너가이 기능을 올바르게 지원하지 않을 수도 있습니다.

+0

:
그러나, 당신이 정말로 원하는 경우 (정당) 당신이 뭔가를 할 수있는 몇 가지 가정이 실패했기 때문에 테스트가 무시되었다는 명확한 표시를해야합니다. 특정 조건이 충족 될 경우에만 테스트를 수행하십시오. 그렇지 않으면 의미가 없습니다. 문제는 실패한 가정이 성공적인 테스트 케이스가된다는 것입니다. 하지만 테스트 케이스가 통과했는지 알 수있는 방법이 없습니다. * 1. 가정이 실패했습니다 * 또는, * 2. 그것은 모든 주장을 통과시켰다. – Daniel

+0

@Daniel : 예, 방금 해보았으며 같은 결과를 얻었습니다. 지금은 이해. 그리고 대답이 없습니다 : ( – creinig

+0

'log.warn'이 JUnit 확장자인지 물어볼 수 있습니까? 그것에 관한 정보를 어디에서 읽을 수 있습니까? – Daniel

0

가정 오류가 오류가 아니기 때문에 오류가 인쇄되지 않습니다. assume 메서드는 값 또는 하나 이상의 개체 (또는 프리미티브)로 인해 실행해서는 안되는 테스트를 단락하는 데 사용됩니다. 가정은 이론 주자를 위해 설계되었지만 다른 주자에게도 사용될 수 있습니다.

가정의 일반적인 용도 중 하나는 실제 테스트 사례 논리를 수행하기 전에 특정 상태로 개체를 가져 오기 위해 일부 작업 집합을 수행해야하는 여러 테스트 메서드가있는 경우입니다.

가정하기 전에 각 테스트는 개체를 원하는 상태로 가져오고 해당 상태에 있음을 주장한 다음 계속합니다. 예를 들어 스택 테스트의 경우 많은 테스트가 비어 있지 않은 스택을 필요로하기 때문에 스택을 생성하고 항목을 밀고 스택이 비어 있지 않은지 확인한 다음 나머지 테스트를 수행합니다 (항목 팝업, 푸시 다른 항목 등).

여러 테스트에서이 패턴을 수행하면 버그가 발생하여 모든 테스트가 실패하게됩니다 (예 : isEmpty()이 항상 true를 반환). 테스트를 실행할 때 너무 많은 오류가 발생하여 시작할 위치를 알 수 없습니다.

따라서 빈 스택으로 항목을 푸시하면 false를 반환하는 하나의 테스트가 있습니다. 오류 메시지를 원하는 경우에 당신은 아마 주장을 사용하려면,

Stack<Object> stack = new Stack<>(); 
stack.push(new Object()); 
assumeFalse(stack.isEmpty()); 
// Continue with the test methods 

: 그런 다음 비어 있지 않은 스택을 필요가있는 시험이 수행합니다.

0

이전 답변에 동의 함 (NamshubWriter 기준). 나는`assumeThat`를 사용하려는 이유는 그

@Before 
public void before() { 
    final String mandatoryPropKey = "system.mandatory-property-for-this-test"; 
    final String mandatoryPropExpectedVal = "true"; 
    try { // try/catch because the Assume failure won't print any message (by design) 
     Assume.assumeTrue("Assumed that the \"" + mandatoryPropKey + "\" system property is \"" + mandatoryPropExpectedVal + "\".", Boolean.valueOf(System.getProperty(mandatoryPropKey, mandatoryPropExpectedVal))); 
    } catch (AssumptionViolatedException ave) { 
     logger.warn("Not executing this test because this assumption failed: {}", ave.getMessage()); 
     throw ave; 
    } 
} 
관련 문제