java - 没有 Spring 上下文的集成测试

标签 java spring spring-boot testing spring-boot-test

我应该在集成测试期间始终启动 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/

相关文章:

java - 如何定义整个spring项目的连接范围——web服务连接范围

java - 使用 Spring Data MongoDB 时,使用 Map 作为 bean 中的属性时出现异常?

java - Spring:发送 HTML 邮件

java - 获取由@PropertySource 加载的文件的名称

java - 如何为所有 Activity 建立一个共享线程?

java - 如何在java网页中使用path和basepath?

java - 如果没有本地仓库并且没有为maven设置环境变量,spring boot如何使用maven?

java - Spring 启动: Json Response is not Mapping to Entity

java - 在Java中,获取给定月份的所有周末日期

java - 使用StanfordCoreNLP提取两个实体之间的关系