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

时间:2018-07-17 13:14:48

标签: java maven junit maven-surefire-plugin junit5

我有一个测试类,可以将其称为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(),但这并不是我想要的。

3 个答案:

答案 0 :(得分:5)

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

  

为了让Maven Surefire完全运行任何测试,请使用TestEngine   实现必须添加到运行时类路径。

默认情况下不存在。
因此,要启用它,您必须配置Jupiter documentation中记录的运行单元测试的maven-surefire-plugin:

"ios": {
    "infoPlist": {
        "UISupportsDocumentBrowser": true,
        "UIFileSharingEnabled": true,
        "LSSupportsOpeningDocumentsInPlace": true
    }
}

不管是什么问题,都不一定很容易发现,因为Maven使用的运行器能够运行Jupiter测试,但无法执行钩子方法...

提示:要知道是否启动了JUnit 5运行程序,可以使用诸如<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> 之类的详细标志执行测试。
如果使用了木星奔跑者,您应该找到类似于以下内容的行:

  

[DEBUG] Surefire报告目录:... \ target \ surefire-报告

     

[DEBUG]使用配置的提供程序   org.junit.platform.surefire.provider.JUnitPlatformProvider

答案 1 :(得分:1)

默认情况下,maven-surefire-plugin接受所有具有* Test.java模式的测试类,在这种情况下,您应将类SomethingTest重命名,并且应该可以

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

答案 2 :(得分:-1)

首先需要做的是添加这样的依赖项:

<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 ...