@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']
}
}
「注射到單元測試,以實現可重複使用的單元測試」 - 我該怎麼辦呢?說實話,我在尋找這樣的東西:'@DearSpringInjectValuesPlease(from ='myconfig.properties')' – AndreyT
注入值的最簡單方法是像傑夫斯科特布朗通過設置屬性來回答。但是,如果你堅持從你的屬性文件加載它,集成測試可能會更合適,否則你將不得不自己提出Grails的集成機制,冒着版本升級後代碼崩潰的風險。 –