如何在代码中禁用 Junit 测试的 Java 断言

2022-09-04 07:57:58

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

Ive 写了一个 junit 测试,但当我运行它时,它不会按预期失败,因为断言是启用的,而它们不在生产环境中。

有没有办法在代码中禁用断言,以便在IDE中运行以及作为Maven的一部分构建时按预期工作


答案 1

在 Java 中(禁用单个类中的断言)

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

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

在 Maven 中(禁用所有类的断言)

从版本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 假设(用于单个测试用例)

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

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 假设是 JUnit 4 假设的扩展。因此,对于 JUnit 5,对 JUnit 4 代码的唯一更改是 import,它现在来自 jupiter:

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

答案 2

通常,您将 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 有关。


推荐