如何在Spring(引导)集成中覆盖bean以惯用的方式测试?
到目前为止,我的源配置如下:
@Configuration
class ApplicationConfiguration {
@Bean
CarsRepository carsRepository() {
// return some real sql db
}
}
这样的测试:
@SpringBootTest
class ApplicationISpec extends Specification {
@Configuration
@Import(Application.class)
static class TestConfig {
@Bean
@Primary
CarsRepository testsCarsRepository() {
// return some in-memory repository
}
}
def "it can do stuff with cars"() {
// do some REST requests to application and verify it works
// there is no need to make real calls to real DB
}
}
首先,测试bean testsCarsRepository
方法必须与原始方法不同(这不明显,并且没有关于它的警告/错误)。
但最后一个问题是:在集成测试中用Spring覆盖bean的惯用方法是什么?
当我在Twitter上发布关于方法名称的WTF时 - Stephane Nicoll表示@Primary
并非用于在测试中覆盖bean。
那么首选方式是什么?
答案 0 :(得分:5)
您可以将@Profile
与@ActiveProfile
注释一起使用来分隔测试和生产配置。例如,将测试配置更改为:
@SpringBootTest
@ActiveProfiles("test")
class CarsISpec extends Specification {
@Configuration
@Import(Application.class)
@Profile("test")
static class TestConfig {
@Bean
CarsRepository testsCarsRepository() {
// return some in-memory repository
}
}
}
不要忘记使用ApplicationConfiguration
标记生产配置@Profile("!test")
。
Spring Boot还提供了大量的测试工具(例如@DataJpaTest
嵌入式数据库,@MockBean
用于在上下文中模拟bean等。Link to doc