为单元测试保存对象时遇到问题

时间:2014-03-24 23:54:36

标签: unit-testing grails spock

我在保存对象(任何对象)进行单元测试时遇到问题。例如,使用给定对象

@Mock([ConvertToDicomService, EventRouterService, User])
@Build([UploadedFile, Manifest])
@TestFor(EventRouterService)
class EventRouterServiceSpec extends ConstraintUnitSpec {
    def setup() {
    User.metaClass.encodePassword = {-> }
    List baseline = []

    User archer = new User( username: 'archerSterling', lastName: 'archer', firstName: 'sterling', accountExpired: 'false', accountLocked: 'false', password: 'password', emailAddress: 'a@gmail.com', externalId: 34)
    baseline.addAll([archer])
    baseline.each {
        println "saving: $it"
        if (!it.save(flush: true)) {
            println "\t... Failed"
        }
    }
}

user控制器上调用save方法

但是用户控制器使用另一个控制器来处理所有操作

import grails.rest.RestfulController

class UserController extends RestfulController<User> {
    static responseFormats = ['json', 'xml']
    UserController() {
        super(User)
    }
}

应该在RestfulController.groovy中执行save方法

/**
 * Saves a resource
 */
@Transactional
def save() {
    def instance = createResource(getParametersToBind())

    instance.validate()
    if (instance.hasErrors()) {
        respond instance.errors, view:'create' // STATUS CODE 422
        return
    }

    instance.save flush:true        
}

但是,当我在调试模式中逐步执行时,RestfulController.save()方法永远不会执行,并且我收到此错误消息

groovy.lang.MissingPropertyException: No such property: save for class: com.example.User Possible solutions: all

承认,我并不熟悉这种类型的控制器交互,需要帮助找出可能的解决方案。任何建议将不胜感激

1 个答案:

答案 0 :(得分:0)

按照docs

中的说明,对您的控制器进行单元测试,您需要模拟您的域类

测试混合基础知识

大多数测试都可以通过TestFor注释结合模拟协作者的Mock注释来实现。例如,要测试控制器和关联域,您需要定义以下内容:

@TestFor(BookController)
@Mock([Book, Author, BookService])

所以在你的例子中:

@TestFor(UserController)
@Mock(User)
class UserControllerSpec extends Specification {
}