java - 我应该如何在没有 xml 的情况下加载 Spring 的 ApplicationContext 进行单元测试?

标签 java spring gradle junit applicationcontext

我有一个像这样的单元测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserTest {

    @Autowired
    UserRepository userRepository;

    @Test
    public void createTest() throws Exception {

         //... blah blah blah

此操作失败,因为我无法使用 @Autowired 加载我的 userRepository:

Failed to load ApplicationContext
java.lang.IllegalStateException: Failed to load ApplicationContext

我没有像 this would suggest 这样的 applicationContext.xml .

我的项目结构如下所示:

.
├── main
│   ├── java
│   │   └── com
│   │       └── foo
│   │           └── bar
│   │               ├── Main.java
│   │               ├── models
│   │               │   └── User.java
│   │               └── repositories
│   │                   └── UserRepository.java
│   └── resources
│       ├── application.yaml
│       ├── public
│       └── templates
└── test
    └── java
        └── com
            └── foo
                └── bar
                    └── models
                        └── UserTest.java

该项目大量使用注释。在我的 Main 类中,我有这样的内容:

@SpringBootApplication
@PropertySources({
        @PropertySource("classpath:application.yaml"),
})
@EnableJpaRepositories(basePackageClasses = {
        UserRepository.class,
})
public class Main {

    public static void main(final String[] args) throws Exception {
        SpringApplication.run(App.class, args);
    }

}

我正在使用 Gradle,并且我有这些测试依赖项:

testImplementation 'junit:junit:4.13'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testImplementation 'org.hamcrest:java-hamcrest:2.0.0.0'

问题:

有人可以向我解释一下发生了什么事吗?可能的原因和解决方案是什么?

最佳答案

您必须指出将提供接口(interface)实现的组件。根据您的情况,您可以执行以下操作:

@RunWith(SpringRunner.class)
@SpringBootTest(classes={Main.class})
public class UserTest {
....}

或者

在测试源中创建配置类,如下所示

@Configuration
@EnableJpaRepositories(basePackageClasses = {
        UserRepository.class,
})
public class PersistenceConfiguration {
}

很可能您也必须创建一个如下所示的配置类:

@Configuration
@@EntityScan(basePackage={"packages.where.you.put.your.entity.classes"})
public class EntityConfiguration {}

之后,在测试中使用该类,如下所示:

@RunWith(SpringRunner.class)
@SpringBootTest(classes={PersistenceConfiguration.class, EntityConfiguraiton.class})
public class UserTest {
 ....}

关于java - 我应该如何在没有 xml 的情况下加载 Spring 的 ApplicationContext 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59814529/

相关文章:

docker - docker多阶段构建期间的Gradle依赖项缓存?

java - java中iterator()方法的返回类型

java - 如何在JSF中上传图片

java - openshift 中 Spring Boot/VertX 调用超时

javascript - Spring session 超时重定向到登录

java - 如何通过内部映射中的参数查找 mongo 文档(最好使用 Spring MongoTemplate)

java - 添加多个源测试目录进行测试

java - 如何避免此 Ant 构建错误?

xml - Spring <sws :interceptors> to annotation based configuration

安卓gradle : All buildTypes are getting executed at the same time