Unit testing 带有服务的单元测试Grails

Unit testing 带有服务的单元测试Grails,unit-testing,grails,junit,Unit Testing,Grails,Junit,当我使用这些值时,我尝试在使用3个域和一个服务执行持久性的控制器上进行测试​​鉴于他正在正常保存,但在我的单元测试中没有通过验证,我不明白为什么。如果有人能帮助我,我不知道我所做的模拟是否正确,我遵循了文档中的示例 这就是错误信息: junit.framework.AssertionFailedError: expected:<1> but was:<0> 这是我的控制器操作: def create = { UsuarioCommand usuario ->

当我使用这些值时,我尝试在使用3个域和一个服务执行持久性的控制器上进行测试​​鉴于他正在正常保存,但在我的单元测试中没有通过验证,我不明白为什么。如果有人能帮助我,我不知道我所做的模拟是否正确,我遵循了文档中的示例

这就是错误信息:

junit.framework.AssertionFailedError: expected:<1> but was:<0>
这是我的控制器操作:

def create = { UsuarioCommand usuario ->

    if(!params.create) return

    if(!usuario.hasErrors()) {

        def secuser = new Secuser(username: usuario.login, password: usuario.senha, senha: usuario.senhaRepeat, enabled: true)


        def user = new Usuario(nomeUsuario: usuario.nome, email: usuario.email, cpf: usuario.cpf, idNivelAcesso: usuario.perfil)
        def cliente = Cliente.findByUsuario( session.usuario )
        user.setIdCliente(cliente)

        def secrole = SecRole.get( usuario.perfil )

        try{
            usuarioService.save(user, secuser, secrole)
            flash.message = "Usuário ${usuario.nome} cadastrado.".toString()
            redirect (action: 'list')
        }catch(ValidationException ex) {
            StringBuilder mensagem = new StringBuilder();
            ex.errors.fieldErrors.each { FieldError field ->
                mensagem.append("O campo ").append( field.field )
                                            .append(" da classe ")
                                            .append( field.objectName )
                                            .append(" com o valor ")
                                            .append( field.rejectedValue )
                                            .append(" não passou na validação.")
                                            .append("\n") 
            }   

            flash.error = mensagem.toString()
            return [usr: usuario]
        }catch(ex) {
            flash.error = ex.message
            render "Erro"
            //return [usr: usuario]
        }
    }else {
        usuario.errors.allErrors.each { println it }
        render "Erro"
        //return [usr: usuario]
    }
}

mockFor
将返回一个模拟控件。必须在mock控件上显式调用
createMock()
,才能获得实际的模拟对象

service = mockFor(UsuarioService).createMock()
看看你提到的同一个链接中的“模仿合作者”。如果您仍然面临问题,可以优化测试


还有一个。

您需要对UsarioService设置一个期望值,以说明调用UsarioService.save(…)时将返回什么

在达到这一点之前,你需要在测试中说 createMock()将创建模拟对象的实际实例,这是您将传递给控制器usarioService属性的内容。从Grails文档复制了下面的代码


还是一样的信息。我所做的“注入”在服务中是正确的?@CarlosEduardo我看不到有问题的服务。在create()调用之前在控制器中设置服务看起来很好(假设您按照下面的方式修复mockFor调用),但是您的create调用几乎会立即返回,除非您填写一些参数(例如params.create)。
service = mockFor(UsuarioService).createMock()
    String testId = "NH-12347686" 
    def otherControl = mockFor(OtherService) 
    otherControl.demand.newIdentifier(1..1) {-> return testId }

    //  Initialise the service and test the target method. 
    def testService = new MyService() 
    testService.otherService = otherControl.createMock()