gpt4 book ai didi

grails - 如何在单元测试中绑定(bind)@Value 注释的服务字段?

转载 作者:行者123 更新时间:2023-12-02 01:21:52 26 4
gpt4 key购买 nike

服务:

@GrailsCompileStatic
class MyService {
final static String PLACEHOLDER = '<x>'

@Value('${myService.url}') // Suppose it http://example.com/doc-<x>.html
private String urlTemplate

String getSomeUrl(String lang) {
urlTemplate.replace(PLACEHOLDER, lang)
}
}

单元测试:
@TestFor(MyService)
class MyServiceSpec extends Specification {

@Unroll
void "test get some url for #lang"() {
when:
def someUrl = service.getSomeUrl(lang) // NullPointerException, because urlTemplate is null
then:
someUrl.endsWith(lang + '.html')
where:
lang << ['es', 'en']
}
}

所以,正如我上面提到的, urlTemplate为空(但配置值存在于 .properties 中)。如何解决?

解决方案:
class MyServiceSpec extends IntegrationSpec {

MyService myService

@Unroll
void "test get some url for #lang"() {
when:
def someUrl = myService.getSomeUrl(lang)
then:
someUrl.endsWith(lang + '.html')
where:
lang << ['es', 'en']
}
}

最佳答案

单元测试用于测试独立的代码单元。如果您正在测试依赖于配置值的行为,请将其注入(inject)到单元测试中以实现可重用的单元测试。

另一方面,如果您要测试变量是否实际设置或变量设置为什么,则需要使用集成测试,因为您基本上是在测试与 Grails 配置机制的集成:http://docs.grails.org/latest/guide/testing.html#integrationTesting

作为第三种选择,您还可以使用功能测试来验证最终一切似乎都按预期运行:http://docs.grails.org/latest/guide/testing.html#functionalTesting

关于grails - 如何在单元测试中绑定(bind)@Value 注释的服务字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39615674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com