在Spring启动应用程序中将autowired对象作为模拟注入spock测试

时间:2015-06-09 10:25:38

标签: spring-boot autowired spock

我有一个Spring Boot应用程序和服务,其中包含私有DAO字段。私有DAO属性使用@Autowired注释(没有setter或构造函数设置它,只是注释)。 我试着为服务编写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代码。

2 个答案:

答案 0 :(得分:5)

结果我这样做了:

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

答案 1 :(得分:0)

很抱歉带来一点点超过一年的生活,但这是我的两分钱。 Groovy确实提供了对私有字段的访问,即使它破坏了封装。如果你还没弄明白,当你用Autowired字段手动实例化一个类时,Autowired字段将为null。您可以为它提供setter并设置它们,或者groovy可以看到私有字段。但是,如果你有奢侈的话,我会建议重构它以使用构造函数注入,并为将来的任何代码执行相同的操作。现场注射和二次注射在测试方面存在一些问题。