Unit testing 使用Spock检查基数时调用太少0

Unit testing 使用Spock检查基数时调用太少0,unit-testing,testing,grails,groovy,spock,Unit Testing,Testing,Grails,Groovy,Spock,我有一个更简单的控制器方法,可以执行以下操作: def updateName(){ def idUser = params.id User changeUser = User.get(idUser) changeUser.name = "newname" changeUser.save(flush: true) } 以及以下Spock测试: def "updateName should edit user and save it&q

我有一个更简单的控制器方法,可以执行以下操作:

def updateName(){
    def idUser = params.id
    User changeUser = User.get(idUser)
    changeUser.name = "newname"
    changeUser.save(flush: true)
}
以及以下Spock测试:

def "updateName should edit user and save it"(){

given: "the id of the user"
    User currentUser = new User([name: "hector" , age: 12]).save(flush: true)
    params.id = User.last().id

when: "the updateName method is called"
    controller.updateName()

then: "name should have change it and save has to be called just one time"
    assert currentUser.name == "newname" // Success
    1 * _.save() // Too few invocations, 0.


}
我已经看到了关于这个主题的所有相关问题,人们建议使用mock和Spy,但我真的不明白为什么要使用它们,而且我没有让它们为我工作,我尝试创建一个用户mock并将我的基数断言更改为:

1 * userMock.save()

但这对我不起作用。。。我能在这方面得到一些帮助吗?

为了让它工作,我创建了一个GroovyMock,它允许我访问静态函数,如save

def "updateName should edit user and save it"(){

given: "the id of the user"
    params.id = 1
    User mockUser = GroovyMock(User, global: true)

when: "the updateName method is called"
    controller.updateName()

then: "set Name and save has to be called just one time"
    1 * User.get(1) >> mockUser
    1 * mockUser.setName("newname")
    1 * mockUser.save()
} //All test passed!

不确定这是不是最好的方法,但对我来说很有效!我会留下这个问题,以防有人提供更好的解决方案,或者抛出一些关于这个问题的好信息。为了让它工作,我创建了一个GroovyMock,它允许我访问静态函数,比如save

def "updateName should edit user and save it"(){

given: "the id of the user"
    params.id = 1
    User mockUser = GroovyMock(User, global: true)

when: "the updateName method is called"
    controller.updateName()

then: "set Name and save has to be called just one time"
    1 * User.get(1) >> mockUser
    1 * mockUser.setName("newname")
    1 * mockUser.save()
} //All test passed!
不确定这是不是最好的方法,但对我来说很有效!如果有人提供了更好的解决方案,或者抛出了一些关于这个问题的好信息,我将留下这个问题

请了解an是什么,然后编辑您的问题,使其成为an。如果你想混淆你的代码,没有类名、导入、包名和很多变量的不连贯的代码片段以及未公开的初始化代码是可以的,但是如果你想从其他人那里了解代码可能有什么问题,那就不行了。例如:
controller
在哪里初始化?控制器类看起来像什么(除了您显示的一个方法)?
用户
类在哪里?1)在groovy控制器测试规范中不需要初始化“控制器”2)为什么要查看控制器的其余部分?MCVE要求最少的信息,而不是不必要的信息3)如果assert currentUser.name==“newname”成功,您不需要知道关于我的用户类的其余信息,只需要知道保存字符串和数字即可。我一点也不觉得我的片段不连贯。请学习什么是A,然后将你的问题编辑成A。如果你想混淆你的代码,没有类名、导入、包名和很多变量的不连贯的代码片段以及未公开的初始化代码是可以的,但是如果你想从其他人那里了解代码可能有什么问题,那就不行了。例如:
controller
在哪里初始化?控制器类看起来像什么(除了您显示的一个方法)?
用户
类在哪里?1)在groovy控制器测试规范中不需要初始化“控制器”2)为什么要查看控制器的其余部分?MCVE要求最少的信息,而不是不必要的信息3)如果assert currentUser.name==“newname”成功,您不需要知道关于我的用户类的其余信息,只需要知道保存字符串和数字即可。我一点也不觉得我的片段不连贯。