2014-09-19 3 views
2

시간이 초과되면 테스트를 통과하면서 딜레마에 빠졌습니다.JUnit - 시간이 초과되면 테스트 케이스를 통과시키는 법?

@Test(timeout=1, expected=Exception.class) 
public void testMovesToSolveMaximum() { 
    PuzzleSolver pS = createSimplePuzzleSolver(maximumPuzzleStateA, maximumPuzzleStateB); 
    PuzzleState goal = new SimplePuzzleState(); 
    goal.configureState(maximumPuzzleStateB); 
    checkThatComputedSolutionIsCorrect(pS, goal); 
} 

그러나 예상 한 결과인데도 불구하고 시간 초과로 인해 테스트 케이스가 실패합니다.

답변

3

나는 당신으로 인해 기본 JUnit을 주자는 전체 시험 평가하는 방식으로 특정 행동을 관찰하는 제대로 질문을 이해한다면 : 그것은 실행 테스트 방법에 설정된 시간 제한이 실현 후

을 그것은 다른 스레드에서 결과를 기다리고 있습니다. 귀하의 예제에서 타임 아웃이 1 [ms]로 설정되어 있으므로 테스트가 실제로 끝나기 전에 주자가 인 타임 아웃 예외를 던지기 전에 타임 아웃에 도달했다고 생각합니다. expected에 걸릴 필요가 있다고 생각합니다. 애트리뷰트의 Test에있는 그러나 의 Test 주석은 테스트 메소드에서 발생한 예외 만 평가하며 시간 초과 확인 메커니즘에서는 발생하지 않습니다. 즉, 예상 예외 메커니즘은 테스트가 아닌 f/w에 의한 타임 아웃 예외 발생에 대해 작동하지 않습니다.

당신의 JUnit에 BlockJUnit4ClassRunner 클래스의 시작이 직접 탐색 할 수 있습니다. (주부터 시작 관련 부분 :이 코드를 통해 이동과 흐름을 이해하는 것이 그렇게 쉬운 일이 아닙니다 ...) :

protected Statement methodBlock(FrameworkMethod method) { 
    Object test; 
    try { 
     test = new ReflectiveCallable() { 
      @Override 
      protected Object runReflectiveCall() throws Throwable { 
       return createTest(); 
      } 
     }.run(); 
    } catch (Throwable e) { 
     return new Fail(e); 
    } 

    Statement statement = methodInvoker(method, test); 
    statement = possiblyExpectingExceptions(method, test, statement); 
    statement = withPotentialTimeout(method, test, statement); 
    statement = withBefores(method, test, statement); 
    statement = withAfters(method, test, statement); 
    statement = withRules(method, test, statement); 
    return statement; 
} 
관련 문제