我应该在集成测试期间始终启动 Spring 上下文吗? (我的意思是使用 @SpringBootTest
注释)
目前我正在编写涉及几个类的集成测试,为了让它更快,我手动创建对象图(即我不启动 Spring IoC 容器)。所以目前我的集成测试(用 Spock 编写)看起来像这样:
class UserConverterIT extends Specification {
UserConverter converter = new UserConverter(new UserDtoFactory(new UserGroupPolicy()))
def 'should ...'() {
when:
converter.convert(...)
then:
...
}
}
或者我可以添加 @SpringBootTest
注释,将 @Autowire
放在 UserConverter
字段上方,所有依赖项都会自动注入(inject)。但是,第一种方法要快得多。这种方法有什么问题吗?
最佳答案
正如您所说,@Autowired
注释将注入(inject)所有依赖项并自动加载整个上下文。您的方法也有效,但它真的很脆弱!
你怎么能保证在你的测试中你永远不需要一些你没有手动新建的 bean?
还有一点很重要。当您让 spring 注入(inject)依赖项时,如果在声明 bean 时出现问题,问题会出现在测试阶段,但在您的方法中它们不会识别。
此外,有时您可能会 @Autowired
一个接口(interface),它告诉 spring 在运行时获取实现。例如,您有一个父模块,它有一个在子模块中实现的接口(interface)。当您想在父级中编写测试用例时,您无权访问子级实现来更新它。
关于java - 没有 Spring 上下文的集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56235109/