spring boot 应用测试策略建议
Posted
技术标签:
【中文标题】spring boot 应用测试策略建议【英文标题】:spring boot application test strategy advice 【发布时间】:2017-03-21 06:24:53 【问题描述】:我有一个简单的 Spring Boot Application 结构如下
src/main/java
com
+- example
+- myproject
+- Application.java
|
+- config
| +- SpringConfig.java
|
+- service
| +- DBService.java
src/main/test
com
+- example
+- myproject
+- config
| +- MyTestRoot.java
src/test/resources
applicationContext-test.xml
Application.java 带有注释
@SpringBootApplication
@EnableJms
@ComponentScan
@EnableTransactionManagement
@EnableAutoConfiguration
SpringConfig.java 带有@Configuration 注释,并且有一个方法可以返回一个新的 DBService 实例。该方法用@Bean注解
@Bean
public DBService dbService()
return new DBService();
DBService 类具有自动装配到其中的存储库。这些存储库来自另一个项目依赖项,并提供到 RDBMS/Data Store 的连接。
我在 applicationContext-test.xml 中定义了一个 bean
<bean id="dbService" class="com.path.to.class.in.dependency"/>
当我在我的测试类中自动装配 dbService 时,我收到一个错误“创建名为 'dbServices' 的 bean 时出错:自动装配依赖项的注入失败;”
我在这里做错了什么?我正在使用 spring boot 1.3.5 并且不能使用 @SpringBootTest 注释,因为它从 1.4 开始可用。任何帮助将不胜感激。
编辑: 由于 DbService 类又引用存储库类(userRepositoty、customerRepository 等),我尝试在测试上下文文件中也为这些存储库定义 bean。但是,我在 DbService 类(在 Main 中)中注入的存储库是接口,Spring Boot 框架会在运行时自动为我解析实际的实现。我不确定如何在测试环境中执行此操作。
【问题讨论】:
@Maciej,感谢您的回答,但这是我目前的问题。我在定义为接口的 Main autowires 存储库中的“DbService”。在运行时,Spring/Spring Boot 会自动从我的项目依赖项中为我提供这些接口的实现。我试图在我的测试类“MyTestRoot”中注入“DbService”,但我不知道如何告诉 spring 在运行单元测试时获取存储库的具体实现。它抛出一个错误:code
创建名为“dbServices”的 bean 时出错:注入自动装配的依赖项失败 code
用你的测试类更新问题。我想你可能错过了那里的一些东西。
【参考方案1】:
我发现以下帖子对我有用:http://tuhrig.de/inject-mocks-with-springs-contextconfiguration/
我的问题是我想要在我的测试中使用 DbService。但是 DbService 依赖于 spring 在运行时解决的外部包依赖项中的其他 bean。我设置了一个 ServiceMockProvider 类,它返回 DbService 使用的所有自动装配 bean 的 Mock。我创建了一个用@ContextConfiguration 注释的基础测试类,并在classes 属性中提供了DbService 类和ServiceMockProvider 类。我所有的测试类都扩展了这个基类,我很高兴去测试。
希望这对某人有所帮助。感谢 Thomas Uhrig 的帖子。
【讨论】:
【参考方案2】:Spring Boot 不会自动从 XML 文件中导入 bean。在您的配置类之一上使用 @ImportResource 注释从 XML 文件创建 bean。
顺便问一下,为什么要在 XML 文件中创建这些 bean?只需为他们使用@Configuration
类并保持简单。
另外,当您使用@SpringBootApplication
时,您不需要:
@EnableAutoConfiguration
@EnableComponentScan
它们是多余的。请参阅 @SpringBootApplication
来源以了解它究竟引入了哪些注释。
【讨论】:
以上是关于spring boot 应用测试策略建议的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot:使用 @DataJpaTest 和 Flyway 设置 Hibernate 命名策略
Spring Boot 实现跨域的 5 种方式,总有一种适合你,建议收藏!!
Spring Boot 实现跨域的 5 种方式,总有一种适合你,建议收藏!!