【问题标题】:JUnit test if Java code assert failsJUnit 测试 Java 代码断言是否失败
【发布时间】:2016-02-11 08:43:17
【问题描述】:

这似乎太简单明了,但我不知道如何测试以下内容:

我的 Java 方法:

public void doSth(final Foo foo) {
    assert foo != null;
    ..
}

我的测试:

 @Test
 public void testAssertion() {
      doSth();
      doSth(new Foo());
 }

我可以用assertEquals 等来测试很多东西,但是如果foo != null; 上的断言给出否定结果,如何创建一个给出真值的测试用例?

我现在的测试在两种断言情况下都是绿色的,但我无法捕捉到断言是否失败。

我希望我的代码测试覆盖率达到 100%,并且想在这一行测试一些有意义的东西。

【问题讨论】:

  • 如果doSth(); 是您的生产代码的一部分,那么使用断言是不好的做法,因为它们在默认情况下被禁用。应该重构它以使用异常。
  • 你尝试过 assertNotNull(foo) 吗?
  • 如果我运行给定的测试,断言现在给出“3/4 分支未覆盖”,所以我想知道是否有机会获得 4/4。除了好奇之外,这有多么有用。我将在这里介绍术语“coverageTesting”,这就是我的目标。
  • 事情不完全是关于断言异常,而是测试断言命令是否被触发。也许我错过了一些东西,但是测试断言失败与测试一些异常不同。虽然不希望事情正常发生(=非常异常),但在我看来,断言和异常是不同的概念。

标签: java unit-testing junit test-coverage


【解决方案1】:

如果断言为假,assert 将抛出 AssertionError

如果要测试当参数为null 时是否发生断言,可以使用@Test 注释的expected 参数进行测试(需要JUnit 4+):

@Test(expected = AssertionError.class)
public void testAssertion() {
    doSth(null);
}

【讨论】:

  • 这对覆盖率没有影响,但现在我至少知道如何“测试”断言。感谢您的见解。
【解决方案2】:

在代码中使用assert 是一种不好的做法。

尝试使用 Java 8 Objects.requireNonNull()

Java 类

public void doSth(final Foo foo) {
    Objects.requireNonNull(foo);
    ..
}

测试类

@Test(expected = NullPointerException.class)
public void testNPE() {
     doSth(null);
}

【讨论】:

  • 在这种特殊情况下使用assert 并不好,即用于公共方法中的参数检查(请参阅Oracle guide),但总的来说这绝对不是坏习惯。看看this的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多