如何在代码中为 junit 测试禁用 Java 断言

How do I disable Java assertions for a junit test in the code

如何在代码中为 junit 测试禁用 java 断言(不是 junit 断言)

我写了一个 junit 测试,但是当我 运行 它没有像预期的那样失败,因为断言被启用,而它们没有在生产中。

有没有一种方法可以仅在代码中禁用断言,以便它在 IDE 中的 运行 以及作为 Maven

的一部分构建时按预期工作

查看 -da-ea parameters 以获得 java 工具。因此,在您的情况下,只需使用其中之一(+ 在您的应用程序中指定相应的包),因为您想要禁用或启用断言。

With no arguments, -enableassertions or -ea enables assertions.

  • With one argument ending in "...", the switch enables assertions in the specified package and any subpackages.
  • If the argument is "...", then the switch enables assertions in the unnamed package in the current working directory.
  • With one argument not ending in "...", the switch enables assertions in the specified class.

通常您将 surefire 与 maven 一起用于 JUnit 测试。添加 -disableassertions 或同义词 -da 作为参数应该有效:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>your_version</version>
    <configuration>
        <argLine>-disableassertions</argLine>
    </configuration>
</plugin>

如果通过 IDE(在 maven 之外)启动不同的测试,您可能需要编辑一些启动配置并传递参数。但是,这取决于 IDE。

在Java内(在singleclass中禁用断言)

要在 Java 中启用或禁用断言检查,请在 ClassLoader 中使用 setClassAssertionStatus。例如:

Foo.class.getClassLoader().setClassAssertionStatus(Foo.class.getName(), false);

在 Maven 中(禁用 all classes 的断言)

从版本 2.3.1 开始,Maven Surefire 有一个单独的 enableAssertions 标志。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>your_version</version>
  <configuration>
    <enableAssertions>false</enableAssertions>
  </configuration>
</plugin>

使用 JUnit 4 假设(对于单个 test 案例)

理想情况下,无论断言是启用还是禁用,您的测试都应该通过。如果其中一项测试依赖于被禁用的断言,则预期的 JUnit 机制是使用 assumption:

import static org.junit.Assume.assumeTrue;

@Test
public foo onlyWithoutAssertions() {
    assumeTrue(assertionsDisabled());
    // your tricky test comes here, and is only executed in 
    // environments with assertion checking disabled.
}

public static boolean assertionsDisabled() {
    return !Foo.class.desiredAssertionStatus();
}

注意:我通常以相反的方式使用此选项:为了检查 assert 是否按预期工作,在极少数情况下,我有一个测试假设断言检查已启用 .

使用 JUnit 5 假设

JUnit 5 assumptions 是 JUnit 4 的扩展。 因此,对于 JUnit 5,对 JUnit 4 代码的唯一更改是导入,它现在来自 jupiter:

import static org.junit.jupiter.api.Assumptions.assumeTrue;

注意:如果您在测试期间禁用断言,您是否完全使用这种 (java) 断言?如果不是,只需删除给定的断言!这只是样板文件。

如果您使用它(在某些 UI 测试、验收测试或性能测试中),因此您期望给定的断言会捕获一些回归并且它们不会在正常发布管道期间被触发,它检查是否有人没有在不知情的情况下删除此类断言是件好事!

您可以在测试中期待异常(AssertionError extends Error extends Throwable)。例如在 junit 测试中使用 assertThrows