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 种方式,总有一种适合你,建议收藏!!

基于Spring Boot的API测试

Hibernate 在整个 Spring Boot 应用程序上设置属性访问策略

在现有 Spring Boot REST 应用程序中实现时区的最佳策略 [重复]