如果它超时,我会因为测试通过而陷入两难境地。
@Test(timeout=1, expected=Exception.class)
public void testMovesToSolveMaximum() {
PuzzleSolver pS = createSimplePuzzleSolver(maximumPuzzleStateA, maximumPuzzleStateB);
PuzzleState goal = new SimplePuzzleState();
goal.configureState(maximumPuzzleStateB);
checkThatComputedSolutionIsCorrect(pS, goal);
}
但是,即使我指定了预期结果,测试用例也会因超时而失败。
答案 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;
}