Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何制作弹簧&x27;s@Autowired是否可以在JUnit5扩展中工作?_Java_Spring_Spring Boot_Junit_Junit5 - Fatal编程技术网

Java 如何制作弹簧&x27;s@Autowired是否可以在JUnit5扩展中工作?

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

我有一个Spring启动应用程序,我正试图在JUnit 5扩展中使用
@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() {
    }

}