JUnit ParentRunner应该捕获AssertionError吗?

时间:2015-09-03 07:10:36

标签: java unit-testing junit4

我已经基于BlockJUnit4ClassRunner实现了自定义TestRunner。

我的假设是,任何失败的断言(表示产品/要求问题)都会通过addFailedAssumption()报告给通知人,而其他例外将通过addFailure()报告,表明单位测试本身存在错误。< / p>

查看结果,addFailedAssumption()从未被调用过。在ParentRunner .runLeaf()的源代码中,我看到了

try {
    statement.evaluate();
} catch (AssumptionViolatedException e) {
    eachNotifier.addFailedAssumption(e);
} catch (Throwable e) {
    eachNotifier.addFailure(e);
} finally {
    eachNotifier.fireTestFinished();
}

我得到的例外都是java.lang.AssertionError类型。

ParentRunner应该AssertionError抓住SELECT Bio FROM Users WHERE CONTAINS (Bio,'promoter') SELECT Bio FROM Users WHERE CONTAINS (Bio,'#promoter') 还是我有误会?

1 个答案:

答案 0 :(得分:0)

阅读有关此主题的更多信息,这似乎是我身上的语言/翻译问题,因为我不是母语人士。

找到班级Assume帮助我做到了(我希望)并且我将用一个例子解释它:

AssumtionViolatedException

的用法

测试可以是在不同的环境中运行,让我们说不同的操作系统。也许产品在不同的操作系统上表现或需要略微不同,例如因为它可以在较新版本的OS上使用API​​调用,而旧版本的操作系统中不存在这种调用。这可能会导致像

这样的代码
if(isApiPresent())
    SimpleAPICall();
else
    // Do some crazy stuff here, potentially slower than the API call

isApiPresent()调用将根据操作系统返回不同的结果,因此您编写2个单元测试并添加有关环境的假设:

@Test
public void isApiPresent_returns_true_on_Win8()
{
    assumeTrue(System.getProperty("os.version").equals("6.2"));
    assertTrue(isApiPresent());
}
@Test
public void isApiPresent_returns_false_on_Win7()
{
    assumeTrue(System.getProperty("os.version").equals("6.1"));
    assertFalse(isApiPresent());
}

如果没有给出关于操作系统的假设,则由于@Test注释仍然会执行测试,但实际上应该忽略它。 assume...()语句会处理这个问题:它们会抛出AssumptionViolatedException,可以用来忽略测试。

Eclipse使用忽略图标标记了一个违反假设(尝试assumeFalse(true);)的测试:

Ignored test in Eclipse

使用AssertionError

我希望通过自定义的TestRunner实现实现的目标有点不同。我想找出哪些单元测试由于需求问题而失败,哪些测试由于其他异常而失败,这些异常可能表明单元测试本身存在错误,在Eclipse中重建图标。 Eclipse已经区分了这两类问题:AssertionError标有蓝色图标,而Exception标有红色图标。

Red and blue unit tests in Eclipse

对我来说,这意味着我必须在fireTestFailure()

中实施决定
public void fireTestFailure(Failure failure) {
    originalNotifier.fireTestFailure(failure);

    if (failure.getException().getClass() == AssertionError.class) {
        // Requirement issue
    } else {
        // Unit test issue
    }
}