Java 如何制作弹簧&x27;s@Autowired是否可以在JUnit5扩展中工作?
我有一个Spring启动应用程序,我正试图在JUnit 5扩展中使用Java 如何制作弹簧&x27;s@Autowired是否可以在JUnit5扩展中工作?,java,spring,spring-boot,junit,junit5,Java,Spring,Spring Boot,Junit,Junit5,我有一个Spring启动应用程序,我正试图在JUnit 5扩展中使用@Autowired。然而,我无法让它工作。(自动连线的@Autowired字段为空。)有人能帮忙吗 下面的代码演示了我遇到的问题(重要的部分是SomeExtension和SomeTest。mvn test会导致测试在之前失败。如果我包含的内容太多,请原谅 src/test/java/somepackage/SomeExtension.java: package somepackage; import org.junit.ju
@Autowired
。然而,我无法让它工作。(自动连线的@Autowired
字段为空。)有人能帮忙吗
下面的代码演示了我遇到的问题(重要的部分是SomeExtension
和SomeTest
。mvn test
会导致测试在之前失败。如果我包含的内容太多,请原谅
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>
4.0.0
食物组ID
硬脂酸
1.0-快照
org.springframework.boot
spring启动程序父级
2.0.3.1发布
org.springframework.boot
SpringBootStarterWeb
org.springframework.boot
弹簧起动试验
测试
朱尼特
朱尼特
org.junit.jupiter
朱尼特木星发动机
5.2.0
测试
1.8
org.springframework.boot
springbootmaven插件
maven surefire插件
2.21.0
org.junit.platform
junit平台surefire提供程序
1.2.0
春假
https://repo.spring.io/libs-release
春假
https://repo.spring.io/libs-release
我在@Value
方面也有类似的问题。如果解决方案也能解决这个问题,那就太好了
谢谢。不能在其他扩展上操作,只能在测试类上操作
所以
…无法工作。这将:
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,我们也可以帮助您找到解决方案。我正在尝试添加一个前置条件和后置条件,在我指定的每个类的每个测试中都必须满足。我的方法是在每次回调之前和之后实现一个扩展。检查前置条件和后置条件postcondition需要访问一些bean。@TheemathasChirananthavat:你能编辑你的问题来澄清这个用例吗?当你在做的时候,你可以删除一些东西,使它变得更短:所有的导入和包声明以及SomeBean
,MainClass
和POM-它们不需要回答你的问题。行动吧通常,如果其他扩展是通过@RegisterExtension
以编程方式注册的,JUnit Jupiter扩展可能会与其他扩展交互。请参阅我的答案;-)为什么不直接使用SpringExtension.getApplicationContext().getBean(SomeBean.class)
在这种情况下?@Torsten+1使用了这种方法,完全解决了我的问题。仅供参考:这基本上是一个重复的问题,下面是我的答案:我刚刚阅读了这个问题,我发现我只需在SomeTest中添加一个字段,并使用@Autowired和@RegisterExtension类型对其进行注释。我必须用@Component注释一些扩展。谢谢,酷!很高兴这对你有帮助。而且。。。当然欢迎您。通过@SpringJUnitConfig或@ContextConfiguration添加spring上下文,我不会说它是重复的,因为这个问题更广泛,Sam的问题更具体。你能“取消复制”这个吗?
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() {
}
}