【发布时间】:2014-10-14 19:39:31
【问题描述】:
我已经阅读了数百篇文章和页面,但我无法找到正确的方法来模拟一些组件进行集成测试。
这是场景:我有一个使用 Spring Boot (1.2-snapshot) 创建的应用程序,在各种 spring 库中,还有 spring data JPA。
我有几个服务,例如 Service1 和 Service2,它们使用 Spring Data 管理的其他组件和存储库。
如果我想使用嵌入式 hsql 数据库测试所有服务以进行完整的集成测试,我会在我的测试包中以这种方式声明一个类:
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = AppConfig.class)
public class IntegrationTest {
@Autowired
private Service1 s1;
@Autowired
private Service2 s2;
[... test methods ...]
}
AppConfig 类在我的主包中,并以这种方式定义:
@ComponentScan
@Configuration
@EnableAutoConfiguration
public class AppConfig {
public static void main(String[] args) {
SpringApplication.run(AppConfig.class, args);
}
}
在集成测试期间,定义了完整的 spring 上下文,所有 spring 数据存储库都照常构建和实例化,一切都按预期正常工作。
但有两种情况我需要不同的目标:
1) 我想一次只测试一个服务(例如:Service1),例如因为 Service2 的初始化速度很慢,我想在不同的测试类中测试它。 我如何实现这个目标?问题是我仍然需要所有的依赖注入,特别是所有的 spring 数据都管理着 Service1 自动装配的存储库。如果我不使用 spring-data 存储库,我可以自己 new() Service1 类,然后手动连接所有依赖项,即使这样也会非常麻烦。
2) 在测试 Service1 时,我想模拟/存根只是他的所有依赖项之一。例如,我将模拟一个在生产中连接到外部服务的组件。 我不知道如何在 spring 上下文中选择性地注入一个存根对象,同时像往常一样继续使用所有其他对象。
非常欢迎您提供有关该主题的帮助。
【问题讨论】:
-
您遵循或建议的方法有什么更新吗?我也需要类似的要求。
标签: integration-testing mockito spring-boot spring-test