JUnit 5不执行使用BeforeEach注释的方法

JUnit 5不会在使用@BeforeEach注释注释的测试类中调用我的方法,其中我初始化测试中所需的测试对象的一些字段。 当试图在测试方法(使用@Test注释的方法)中访问这些字段时,我显然得到一个NullpointerException。 所以我在方法中添加了一些输出消息。

 import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class TestClass { private String s; public TestClass() { } @BeforeEach public void init() { System.out.println("before"); s = "not null"; } @Test public void test0() { System.out.println("testing"); assertEquals("not null", s.toString()); } } 

在运行mvn clean test时测试的输出中,我从使用@Test注释注释的test0()方法获得“testing”消息,但不打印“before”消息。

 Running de.dk.spielwiese.TestClass !!!testing!!! Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0 sec <<< FAILURE! de.dk.spielwiese.TestClass.test0() Time elapsed: 0 sec <<< FAILURE! java.lang.NullPointerException at de.dk.spielwiese.TestClass.test0(TestClass.java:24) 

我能想到的非常明显且唯一的原因是没有调用init()方法。 @BeforeEach的文档说

@BeforeEach用于表示在当前测试类中的每个@ Test,@ RepeatedTest,@ ParameterizedTest,@ TestFactory和@TestTemplate方法之前应该执行带注释的方法。

我也尝试在eclipse中运行测试,并且它们总是没有任何错误地通过。

我正在使用maven 3.5.3。 我在我的pom.xml中将JUnit Jupiter 5.1.0声明为依赖项

  4.0.0 de.dk spielwiese 0-SNAPSHOT jar Spielwiese  UTF-8     maven-assembly-plugin 3.0.0    de.dk.spielwiese.Spielwiese    jar-with-dependencies  false Spielwiese    assemble-all package  single      maven-compiler-plugin 3.6.2  1.8 1.8    maven-jar-plugin 3.0.2      de.dk util 0.0.1   org.junit.jupiter junit-jupiter-engine 5.1.0 test   

为什么我的init()方法没有被调用?

您的init()方法未被调用,因为您没有指示Maven Surefire使用JUnit Platform Surefire Provider。

因此, 令人惊讶的是,您的测试甚至没有使用JUnit运行。 相反,它正在运行Maven Surefire支持他们所谓的POJO测试 。

将以下内容添加到您的pom.xml应该可以解决问题。

    maven-surefire-plugin 2.19.1   org.junit.platform junit-platform-surefire-provider 1.1.0      

Sam Brannen的回答对我有用,但似乎它不适用于2.22.0版本的maven-surefire-plugin,除非你将junit-platform-surefire-provider升级到1.2.0。 意识到!