【发布时间】:2015-03-02 17:53:33
【问题描述】:
我已经尝试解决这个问题 2 天了,我真的很困惑和沮丧。我有一个带有用于自定义验证的服务的域对象。域如下所示:
class Llama {
String name
transient myFetcherService
static transients = [
'myFetcherService'
]
static constraints = {
name validator: { val, obj ->
if (obj.nameExists(val) == true) {
//return some error here.
}
}
}
protected boolean nameExists(String name) {
List<Llama> llamasList = myFetcherService.fetchExistingLlamasByName(name)
if (llamasList.isEmpty()) {
return false
}
return true
}
}
现在,我有另一个服务,它只是保存 Llama 对象的列表。它看起来像这样:
class LlamaFactoryService {
public void createLlamas(List<String> llamaNames) {
llamaNames.each { name ->
new Llama(name: name).save()
}
}
}
在我的测试中。我不断收到此错误:
Failure: createLlamas should create Llammas (com.myLlamaProject.LlamaFactoryServiceSpec)
| java.lang.NullPointerException: Cannot invoke method myFetcherService on null object
我不明白。在我的测试中,在“给定”部分中为服务添加了一个元类。当它尝试保存时,它表明该服务为空。这是我的测试的样子:
given:
def myFetcherService = mockFor(MyFetcherService)
myFetcherService.demand.fetchExistingLlamasByName {def name -> return []}
Llama.metaClass.myFetcherService = myFetcherService.createMock()
when:
service.createLlamas(['Pablo','Juan','Carlos'])
then:
//some validations here....
我还尝试在方法nameExists() 上使用metaClass,例如:
Llama.metaClass.myFetcherService = { def name -> false }
,但它给了我与上面相同的 nullPointerException。有人能指出我正确的方向吗?我有点卡住了。 :(
提前感谢您的阅读和帮助。
【问题讨论】:
-
无论是单元测试还是集成测试都在这里添加相关标签。
-
这是一个单元测试.. 谢谢
标签: unit-testing grails testing