【问题标题】:JUnit test another method that uses fail()JUnit 测试另一个使用 fail() 的方法
【发布时间】:2015-03-27 12:39:36
【问题描述】:

我们有一个相当复杂的对象,它是调用我们的 drools 引擎的结果。 对于 JUnit 测试我们的规则,我们创建了一个 RulesTestHelper 类,它提供了一个方法 "assertOurObject(OurObject expected, OurObject actual)" 并对 OurObject 的元素执行许多断言(这可能通过编写我们自己的 Matcher 来解决,但我们还没有那么远)。

现在在我们的方法“assertOurObject”中,首先检查是否有任何对象为空,如下所示:

    if (expected == null || actual == null)
      fail("Expected or actual is null");

现在我想对这个方法进行 JUnit 测试,并断言当我将两个对象之一设置为“null”时,我将无法通过测试。所以换句话说,我预计测试会失败,这应该没问题。

这可能吗?如果可以,怎么做?

【问题讨论】:

  • 那么你想写一个测试来测试测试吗?从 Java 7 开始使用 Objects.requireNonNull(expected); 怎么样。如果预期为空,它将抛出 NPE,您可以通过说您希望抛出 NPE 来轻松地使用 JUnit 进行测试。
  • 当你向方法发送一个空对象时会发生什么吗?您可以对这一事实进行 junit 测试。
  • 由于此更改可能会影响所有测试,因此我建议您创建一个新方法,其中一个参数可能为null,否则测试必须失败。这更容易理解和维护。

标签: java junit


【解决方案1】:

如果您不想更改代码,可以使用类似于 Anderson Vieira 所说的解决方案,但改为使用

@Test(expected=AssertionError.class)

junit fail() 方法会抛出一个 AssertionError,您可以特别期待

【讨论】:

  • @JBNizet 感谢您指出这一点。我的观点仍然有效,fail() 会引发错误,并且由于@Test 可以捕获 Throwable,我们可以预期 - 您只需要检查您的 JUnit 版本抛出的特定类型。
  • @JBNizet 根据您的评论更改以支持最新的 JUnit,我正在查看 JUnit 的古老版本的源代码
【解决方案2】:

当这种情况发生时,您可以抛出异常,并通过以下注释告诉测试预期它:

@Test(expected=NullPointerException.class)
public void testShouldFailIfAnyObjectIsNull() {
    ... // do something
    if (expected == null || actual == null) {
        throw new NullPointerException();
    }
    ... // do something
}

【讨论】:

    猜你喜欢
    • 2019-06-23
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多