JUnit 5はBeforeEachで注釈されたメソッドを実行しません質問する

JUnit 5はBeforeEachで注釈されたメソッドを実行しません質問する

@BeforeEachJUnit 5は、テストに必要なテスト オブジェクトのいくつかのフィールドを初期化する、アノテーションが付けられたテスト クラス内のメソッドを呼び出しません。テスト メソッド (アノテーションが付けられたメソッド@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から「テスト」メッセージが表示されますが、「前」メッセージは印刷されません。test0()@Test

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を依存関係として宣言しました。

<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">
<modelVersion>4.0.0</modelVersion>

<groupId>de.dk</groupId>
<artifactId>spielwiese</artifactId>
<version>0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>Spielwiese</name>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>de.dk.spielwiese.Spielwiese</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <appendAssemblyId>false</appendAssemblyId>
                <finalName>Spielwiese</finalName>
            </configuration>
            <executions>
                <execution>
                    <id>assemble-all</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>de.dk</groupId>
        <artifactId>util</artifactId>
        <version>0.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.1.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

メソッドが呼び出されないのはなぜですかinit()?

ベストアンサー1

私の場合、問題は@Test注釈が間違ったインポートから取得されたことでした。元々は からインポートされましたorg.junit.Test。 に切り替えると、org.junit.jupiter.api.Test問題は解決しました。

元のコードが間違っています:

import org.junit.Test;

@BeforeEach
...some code

@Test
...some code

修正されたコードを修正:

import org.junit.jupiter.api.Test;

@BeforeEach
...some code

@Test
...some code

おすすめ記事