JUnit - 如果测试用例超时,如何使测试用例通过?

时间:2014-09-19 01:27:13

标签: 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);
}

但是,即使我指定了预期结果,测试用例也会因超时而失败。

1 个答案:

答案 0 :(得分:3)

如果我正确理解了这个问题,那么由于默认JUnit运行器评估整个测试的方式,您正在观察特定的行为:

在意识到测试方法设置了超时后,它会在另一个线程中运行它并等待结果。由于示例中的超时设置为1 [ms],我认为它在测试实际完成之前达到超时,这使得转轮抛出超时异常(实际上是java.lang.Exception),您认为需要被expected注释中的Test属性捕获。但是expected注释上的属性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;
}