【问题标题】:Inject autowired object as mock into spock test in spring boot application在 Spring Boot 应用程序中将自动装配的对象作为模拟注入到 spock 测试中
【发布时间】:2015-06-09 10:25:37
【问题描述】:

我有一个 Spring Boot 应用程序和 Service,其中包含私有 DAO 字段。私有 DAO 属性用 @Autowired 注释(没有设置器或构造器设置它,只是注释)。 我尝试为服务编写 Spock 测试,但找不到如何将模拟 DAO 注入 @Autowired 变量。

class TestService extends Specification {
    DAO dao = Mock(DAO)
    Service service = new Service()

    def "test save"() {
        when:
        service.save('data')

        then:
        1 * dao.save('data')
    }
}

有什么想法吗?

UPD:我正在测试 java 代码。

【问题讨论】:

  • 您可以创建一个包字段并分配它。
  • 使用 @Autowired 的构造函数来代替 - 在 spring 和单元测试中都能很好地工作

标签: spring-boot autowired spock


【解决方案1】:

结果我这样做了:

class TestService extends Specification {
    DAO dao = Mock(DAO)
    Service service = new Service()

    void setup() {
        service.dao = dao
    }

    def "test save"() {
        when:
        service.save('data')

        then:
        1 * dao.save('data')
   }
}

有一点是使用反射。但是 Groovy 可以直接设置私有字段而无需额外的操作。这对我来说是个新闻。

【讨论】:

  • dao 变量不是私有的,而是默认的。默认范围变量可以在同一个包中访问。您的 TestService 必须与您的 Service 类在同一个包中。
  • 我正在测试 java 代码,其中 dao 是服务内部的私有字段。不包私有。不过谢谢你的来信。
【解决方案2】:

很抱歉让一年多一点的旧线程栩栩如生,但这是我的两分钱。 Groovy 确实提供了对私有字段的访问,即使它破坏了封装。以防万一,如果您还没有弄清楚,当您手动实例化具有 Autowired 字段的类时,Autowired 字段将为空。您可以为它提供设置器并设置它们,或者 groovy 无论如何都可以看到私有字段。但是,如果您有奢侈品,我建议您重构它以使用构造函数注入,并在将来对您的任何代码执行相同的操作。 Field Injection 和 setter injection 在测试方面存在一些问题。

【讨论】:

    猜你喜欢
    • 2018-03-28
    • 1970-01-01
    • 2017-02-25
    • 2017-11-30
    • 2021-05-28
    • 2017-06-01
    • 2015-04-25
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多