Maven 不会 运行 @BeforeEach 方法而 运行ning
Maven does not run @BeforeEach Methods while running
我有一个测试 Class 让我们称之为 TestSomething
,一个测试对象让我们称之为 SomeObject
。
现在我在每个新的单一测试中都需要这个对象,这意味着我的代码中有一个 @BeforeEach
可以在字段中加载这个对象:
import me.test.SomeObject;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class TestSomething {
private SomeObject someObject;
@BeforeEach
public void load() {
someObject = new SomeObject();
}
@Test
public void test1() {
boolean result = someObject.checkForSomething();
Assertions.assertEquals(true, result);
}
@Test
public void test2() {
boolean result = someObject.checkForSomethingElse();
Assertions.assertEquals(false, result);
}
pom.xml 来自测试模块:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>test</artifactId>
<groupId>me.test</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<properties>
<projectVersion>1.0.0</projectVersion>
<maven.deploy.skip>false</maven.deploy.skip>
</properties>
<artifactId>Tests</artifactId>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.0.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>me.test</groupId>
<artifactId>project</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
不确定它是否相关,但对象 SomeObject
在一个单独的模块中,并且测试模块依赖于具有范围 test
的模块。 (我也尝试了 provided
和 compile
)
所以现在如果我 运行 这个在 InteliJ 中的测试他们工作得很好。但是现在如果我尝试构建我的项目,测试会失败,出现 NullPointerExceptions 因为 someObject
是 null
.
现在我在每个测试中调用方法 load()
的测试工作,但这并不是我想要的。
maven-surefire-plugin 默认接受所有具有模式 *Test.java 的测试 classes,在你的情况下你应该重命名 class SomethingTest 它应该没问题
https://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html
Maven默认不会运行使用Jupiter引擎进行测试
In order to have Maven Surefire run any tests at all, a TestEngine
implementation must be added to the runtime classpath.
默认情况下不存在。
因此,要启用它,您必须配置 运行s 单元测试的 maven-surefire-plugin,如 Jupiter documentation :
中所述
更新(2020 年 10 月 28 日):
自版本 2.22.0 起,您只需指定对所需 junit 引擎的测试依赖项。如果不这样做,也会导致问题中描述的行为。
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
保留原答案作为参考,2.22.0版本之前的解决方案是:
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
无论是什么问题都不一定容易发现,因为 Maven 使用的 运行ner 能够 运行 Jupiter 测试,但无法执行挂钩方法...
提示:要了解 JUnit 5 运行ner 是否启动,您可以使用详细标志执行测试,例如:mvn test -X
.
如果使用了 Jupiter 运行ner,你应该找到类似这样的行:
[DEBUG] Surefire report directory: ...\target\surefire-reports
[DEBUG] Using configured provider
org.junit.platform.surefire.provider.JUnitPlatformProvider
首先你需要做的是像这样添加一个依赖:
<dependencies>
[...]
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0</version>
<scope>test</scope>
</dependency>
[...]
</dependencies>
接下来就是使用最新版本的 maven-surefire-plugin/maven-failsafe-plugin like this:
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<excludes>
<exclude>some test to exclude here</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
从版本 2.22.0 surefire 开始支持 JUnit 5...
我有一个测试 Class 让我们称之为 TestSomething
,一个测试对象让我们称之为 SomeObject
。
现在我在每个新的单一测试中都需要这个对象,这意味着我的代码中有一个 @BeforeEach
可以在字段中加载这个对象:
import me.test.SomeObject;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class TestSomething {
private SomeObject someObject;
@BeforeEach
public void load() {
someObject = new SomeObject();
}
@Test
public void test1() {
boolean result = someObject.checkForSomething();
Assertions.assertEquals(true, result);
}
@Test
public void test2() {
boolean result = someObject.checkForSomethingElse();
Assertions.assertEquals(false, result);
}
pom.xml 来自测试模块:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>test</artifactId>
<groupId>me.test</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<properties>
<projectVersion>1.0.0</projectVersion>
<maven.deploy.skip>false</maven.deploy.skip>
</properties>
<artifactId>Tests</artifactId>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.0.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>me.test</groupId>
<artifactId>project</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
不确定它是否相关,但对象 SomeObject
在一个单独的模块中,并且测试模块依赖于具有范围 test
的模块。 (我也尝试了 provided
和 compile
)
所以现在如果我 运行 这个在 InteliJ 中的测试他们工作得很好。但是现在如果我尝试构建我的项目,测试会失败,出现 NullPointerExceptions 因为 someObject
是 null
.
现在我在每个测试中调用方法 load()
的测试工作,但这并不是我想要的。
maven-surefire-plugin 默认接受所有具有模式 *Test.java 的测试 classes,在你的情况下你应该重命名 class SomethingTest 它应该没问题
https://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html
Maven默认不会运行使用Jupiter引擎进行测试
In order to have Maven Surefire run any tests at all, a TestEngine implementation must be added to the runtime classpath.
默认情况下不存在。
因此,要启用它,您必须配置 运行s 单元测试的 maven-surefire-plugin,如 Jupiter documentation :
更新(2020 年 10 月 28 日):
自版本 2.22.0 起,您只需指定对所需 junit 引擎的测试依赖项。如果不这样做,也会导致问题中描述的行为。
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
保留原答案作为参考,2.22.0版本之前的解决方案是:
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
无论是什么问题都不一定容易发现,因为 Maven 使用的 运行ner 能够 运行 Jupiter 测试,但无法执行挂钩方法...
提示:要了解 JUnit 5 运行ner 是否启动,您可以使用详细标志执行测试,例如:mvn test -X
.
如果使用了 Jupiter 运行ner,你应该找到类似这样的行:
[DEBUG] Surefire report directory: ...\target\surefire-reports
[DEBUG] Using configured provider org.junit.platform.surefire.provider.JUnitPlatformProvider
首先你需要做的是像这样添加一个依赖:
<dependencies>
[...]
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0</version>
<scope>test</scope>
</dependency>
[...]
</dependencies>
接下来就是使用最新版本的 maven-surefire-plugin/maven-failsafe-plugin like this:
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<excludes>
<exclude>some test to exclude here</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
从版本 2.22.0 surefire 开始支持 JUnit 5...