2

我正在尝试对使用3个域和一个服务来执行持久性的控制器进行测试,当我使用这些值时,他正在正常保存,但是在我的单元测试中没有通过验证,我不明白为什么. 如果去过那里的人可以帮助我,我不知道我正在做的Mock是否正确,我按照官方文档中的示例进行操作

那是错误信息:

junit.framework.AssertionFailedError: expected:<1> but was:<0>

那是我的测试代码:

@TestFor(UsuarioController)
@Mock([SecRole, UsuarioService, Usuario, Cliente, Secuser])
@TestMixin(ControllerUnitTestMixin)
class UsuarioTests {

    private def usuarioCommand
    private def service

    @Before
    void setUp() {
        usuarioCommand = mockCommandObject(UsuarioCommand)
        service = mockFor(UsuarioService)
    }

    @Test
    void testCadastrarUsuarioCorreto() {

        usuarioCommand.perfil = 2
        usuarioCommand.nome = "Michael Swaltz"
        usuarioCommand.cpf = "381.453.718-13"
        usuarioCommand.email = "michael.s@mail.com"
        usuarioCommand.login = "login"
        usuarioCommand.senha = "senha"
        usuarioCommand.senhaRepeat = "senha"

        assertTrue( usuarioCommand.validate() );

        controller.usuarioService = service

        controller.create(usuarioCommand)

                assertEquals(1, Usuario.count())
    }

这是我的控制器动作:

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]
    }
}
4

2 回答 2

4

mockFor会给你一个模拟控制。您必须显式调用createMock()模拟控件才能获取实际的模拟对象。

service = mockFor(UsuarioService).createMock()

从您提到的同一链接中查看“Mocking Collaborators”。如果您仍然遇到问题,可以优化测试。

类似的例子和一个在这里

于 2013-09-16T15:11:19.180 回答
1

您需要在 UsarioService 上设置一个期望,以说明调用 usarioService.save(...) 时将返回的内容。

在达到这一点之前,您需要在测试 mockUsarioService.createMock() 中说,它将创建模拟对象的实际实例,这就是您将传递给控制器​​ usarioService 属性的内容。从 Grails 文档中复制以下代码。http://grails.org/doc/1.1/guide/9.%20Testing.html

    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()
于 2013-09-19T16:00:02.580 回答