在 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 注入在测试时存在一些问题。
我有一个 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 注入在测试时存在一些问题。