在 spring 启动应用程序中将自动装配对象作为模拟注入 spock 测试

Inject autowired object as mock into spock test in spring boot application

我有一个 Spring 引导应用程序和服务,其中包含私有 DAO 字段。 Private 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')
    }
}

有什么想法吗?

更新: 我正在测试 java 代码。

结果我这样做了:

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 可以直接设置私有字段而不需要额外的操作。这对我来说是个新闻。

很抱歉让一个使用了一年多的旧线程重新出现,但这是我的两分钱。 Groovy 确实提供了对私有字段的访问,即使它破坏了封装。以防万一,如果您还没有弄清楚,当您手动实例化一个带有自动装配字段的 class 时,自动装配字段将为空。您可以为其提供 setter 并设置它们,或者 groovy 仍然可以看到私有字段。但是,如果您有足够的钱,我建议您重构它以使用构造函数注入,并在将来对您的任何代码执行相同的操作。字段注入和 setter 注入在测试时存在一些问题。