gpt4 book ai didi

java - Maven 在运行时不运行@BeforeEach 方法

转载 作者:搜寻专家 更新时间:2023-11-01 01:49:05 25 4
gpt4 key购买 nike

我有一个测试类可以称之为 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 的模块。 (我也试过providedcompile)

所以现在如果我在 InteliJ 中运行这个测试,它们工作得很好。但现在如果我尝试构建我的项目,测试会失败,并出现 NullPointerExceptions,因为 someObjectnull

现在我在每个测试中调用方法 load() 的测试工作,但这并不是我想要的。

最佳答案

默认情况下,Maven 不会使用 Jupiter 引擎运行测试

In order to have Maven Surefire run any tests at all, a TestEngineimplementation must be added to the runtime classpath.

默认情况下不存在。
因此,要启用它,您必须配置运行单元测试的 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 使用能够运行 Jupiter 测试但无法执行 Hook 方法的运行器...

提示:要了解 JUnit 5 运行器是否已启动,您可以使用详细标志执行测试,例如:mvn test -X
如果使用 Jupiter runner,您应该找到如下所示的行:

[DEBUG] Surefire report directory: ...\target\surefire-reports

[DEBUG] Using configured providerorg.junit.platform.surefire.provider.JUnitPlatformProvider

关于java - Maven 在运行时不运行@BeforeEach 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51382356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com