【问题标题】:Integration testing without Spring context没有 Spring 上下文的集成测试
【发布时间】:2023-03-22 12:34:01
【问题描述】:

我应该在集成测试期间始终启动 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 字段上方,所有依赖项将自动注入。但是,第一种方法要快得多。这种方法有什么问题吗?

【问题讨论】:

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


    【解决方案1】:

    正如您所说,@Autowired 注释将注入所有依赖项并自动加载整个上下文。你的方法也有效,但它真的很脆弱! 你怎么能保证在你的测试中你永远不需要一些你没有手动新建的bean?

    还有一件很重要的事情。当您让 spring 注入依赖项时,如果在声明 bean 时出现问题,问题将显示在测试阶段,但在您的方法中它们不会识别。

    您有时可能会@Autowired 一个接口,它告诉spring 在运行时获取实现。例如,您有一个父模块,它有一个在子模块中实现的接口。当您想在父级中编写测试用例时,您无权访问子级实现来对此进行修改。

    【讨论】:

    • “你怎么能保证在你的测试中你永远不需要一些你没有手动新建的bean?”我只使用构造函数注入,所以我需要通过构造函数提供所有依赖项。如果我错过了任何必需的 bean,我的代码将无法编译。
    • @k13i 如果您在整个应用程序中仅使用构造函数注入,那么您将不会遇到任何问题。我还用您的方法中的另一个问题更新了我的答案。完全如我所说,它有效,但它很脆弱,建议避免使用。
    • "当你让 spring 注入依赖项时,如果声明 bean 有问题,问题会在测试阶段显示,但在你的方法中他们不会识别。"我同意,但我的问题是“我应该在集成测试期间始终启动 Spring 上下文吗?”。我确实有启动 Spring 上下文的测试,他们发现 bean 声明等问题。我只有一些在没有 Spring 上下文的情况下运行的集成测试
    猜你喜欢
    • 1970-01-01
    • 2020-07-26
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多