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

我有一个测试类让我们称之为,一个测试对象让我们调用这个。TestSomethingSomeObject

现在我需要这个对象在每个单一测试新,这意味着我在我的代码中有一个在字段中加载这个对象:@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>

不确定它是否相关,但对象位于单独的模块中,并且测试模块对具有作用域的模块具有依赖关系。(我也试过和SomeObjecttestprovidedcompile)

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

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


答案 1

默认情况下,Maven 不会将 Jupiter 引擎作为

为了让 Maven Surefire 运行任何测试,必须将 TestEngine 实现添加到运行时类路径中。

默认情况下,这不存在。
因此,要启用它,您必须配置运行单元测试的maven-surefire-插件,如Jupiter文档中所述:

更新 (28.10.2020):

从版本 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测试但无法执行钩子方法的跑步者......

作为提示:要知道JUnit 5运行器是否已启动,您可以使用详细标志执行测试,例如: 。
如果使用木星跑者,您应该找到如下所示的线条:mvn test -X

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

[调试]使用已配置的 provider org.junit.platform.surefire.provider.JUnitPlatformProvider


答案 2

默认情况下,maven-surefire-plugin会接受所有具有模式*Test.java测试类,在你的情况下,你应该重命名类SomethingTest,它应该没问题

https://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html


推荐