我已经阅读了数百篇帖子和页面,但我无法找到正确的方法来进行集成测试,只是模拟一些组件。
这是一个场景:我使用Spring Boot(1.2快照)和各种弹簧库创建了一个应用程序,也是弹簧数据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数据存储库都构建并实例化为usuale,并且一切正常。
但有两种情况我需要不同的目标:
1)我想一次只测试一个服务(例如:Service1),例如因为Service2初始化很慢,我想在不同的测试类中测试它。 我如何实现这一目标?问题是我仍然需要所有依赖注入,特别是所有spring数据都管理Service1自动自动装配的存储库。如果我没有使用spring-data存储库,我可以自己new()Service1类,然后手动连接所有依赖项,即使这样也很麻烦。
2)在测试Service1时,我想做mock / stub只是其中一个依赖项。例如,我将模拟生产中连接到外部服务的组件。 我不知道如何在弹簧上下文中选择性地注入一个存根对象,同时继续像往常一样使用所有其他对象。
非常欢迎有关该主题的一些帮助。
答案 0 :(得分:0)
您可以创建在不同配置文件上设置的不同测试bean,然后使用这些配置文件执行测试,而不是使用Mockito模拟。
有一些例子(当然,它只是一个关于你如何做到这一点而不是确切解决方案的愿景)你可以快速添加个人资料'并使用@ActiveProfiles运行测试(' fast')。然后你会得到用@Profile注释的测试配置(' fast'),它将设置你需要的所有bean