我一直试图弄清楚这2天现在,我真的卡住和沮丧。我有一个域对象和一个正在用于自定义验证的服务。该域看起来像这样:Grails 2.4.4:如何模拟域内的瞬态服务?
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
}
}
现在,我有另一个服务,它只保存一个美洲驼对象的列表。它看起来像这样:
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
我不明白。在我的测试中,在“给定”部分为服务添加了一个metaClass。当它试图保存时,它告诉服务是空的。这是我的测试是什么样子:
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异常,如上图所示。有人能指出我正确的方向吗?我有点卡住了。 :(
预先感谢阅读和帮助。
无论是单元还是集成测试,在这里添加相关标签。 – Abs 2015-03-02 18:00:57
这是一个单元测试..谢谢 – CancerMan 2015-03-02 18:10:22