Spring Bootアプリケーションがあり、JUnit 5拡張機能で@Autowired
を使用しようとしています。しかし、私はそれを機能させることができません。 (@Autowired
フィールドはnullです。)誰か助けてもらえますか?
以下は、私が抱えている問題を示すコードです(重要な部分はSomeExtension
とSomeTest
です。書かれているように、mvn test
はbeforeEach
でテストを失敗させます含まれている場合は申し訳ありません。
src/test/Java/somepackage/SomeExtension.Java:
package somepackage;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SomeExtension implements BeforeEachCallback {
@Autowired
SomeBean bean;
@Override
public void beforeEach(ExtensionContext context) {
assertNotNull(bean);
}
}
src/test/Java/somepackage/SomeTest.Java:
package somepackage;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ExtendWith(SomeExtension.class)
class SomeTest {
@Test
void nothingTest() {
}
}
src/main/Java/somepackage/SomeBean.Java
package somepackage;
import org.springframework.stereotype.Component;
@Component
public class SomeBean {
}
src/main/Java/somepackage/MainClass.Java
package somepackage;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MainClass {
public static void main(String[] args) {
SpringApplication.run(MainClass.class, args);
}
}
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">
<modelVersion>4.0.0</modelVersion>
<groupId>fooGroupId</groupId>
<artifactId>barArtifactId</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<!-- Don't include Junit 4 -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<Java.version>1.8</Java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<!--
This is copied from https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven
This allows the surefire plugin to be able to find Junit 5 tests, so `mvn test` works.
-->
<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>
</dependencies>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
</project>
@Value
でも同様の問題が発生しています。ソリューションがそのためにも機能する場合、それは素晴らしいでしょう。
ありがとうございました。
JUnit 5拡張機能 は、テストクラスだけで、他の拡張機能を操作できません。
そう...
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SomeExtension implements BeforeEachCallback {
@Autowired
SomeBean bean;
@Override
public void beforeEach(ExtensionContext context) {
assertNotNull(bean);
}
}
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ExtendWith(SomeExtension.class)
class SomeTest {
@Test
void nothingTest() {
}
}
...機能しません。これは:
public class SomeExtension implements BeforeEachCallback {
@Override
public void beforeEach(ExtensionContext context) {
// [...]
}
}
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ExtendWith(SomeExtension.class)
class SomeTest {
@Autowired
SomeBean bean;
@Test
void nothingTest() {
}
}
拡張機能でBeanが必要な理由を説明できる場合は、その解決策を見つけるお手伝いをすることもできます。