Problema com montagem de Test de Integração
19/07/2011 16:29
0
Pessoal,

estou com uma grande dificuldade na montagem de alguns testes básicos.

EU tenho a seguinte classe:

class Usuario {

String nome
Perfil pessoal
Boolean bloqueado


static belongsTo = [login:Login]
static hasMany = [atendimentos: Atendimento]

static constraints = {
nome(nullable: true)
pessoal(nullable: true)
bloqueado()

}

}

E o Controlador:

class UsuarioController {

def scaffold = true

}

Criei um teste de integração chamado UsuarioIntegrationTests.groovy e inseri os 2 testes abaixo:

void testPrimeiro() {

def userTest = new Usuario(nome: "Fulano de Tal")
assertFalse userTest.validate()
assertTrue userTest.hasErrors()

assertNotNull userTest.save() // Linha 14: aqui da erro. Fala que save() esta retornando nulo
assertNotNull userTest.id
def foundUser = Usuario.get(userTest.id)
assertEquals 'Fulano de Tal', foundUser.temp
}


void testSegundo(){

def userTest = new Usuario().save()

def coment1 = new Atendimento(descricao: "Primeiro ... W00t!")
userTest.addToAtendimentos(coment1) // linha 27: diz que o metodo .addToAtendimentos não pode ser incocado.
def coment2 = new Atendimento(descricao: "Segundo ... W00t!")
userTest.addToAtendimentos(coment2)
def coment3 = new Atendimento(descricao: "Terceiro ... W00t!")
userTest.addToAtendimentos(coment3)

assertEquals 3, Usuario.get(userTest.id).recados.size()

}

Porém nenhum deles funciona e dá o seguinte erro:

Erro: junit.framework.AssertionFailedError: junit.framework.AssertionFailedError: null
at jorg.UsuarioIntegrationTests.testPrimeiro(UsuarioIntegrationTests.groovy:14)



Já no testSegundo() diz que é um erro:



Cannot invoke method addToAtendimentos() on null object
java.lang.NullPointerException: Cannot invoke method addToAtendimentos() on null object
at jorg.UsuarioIntegrationTests.testSegundo(UsuarioIntegrationTests.groovy:27)


Alguém poderia me orientar como proceder? Estou usando algum comando errado?
Tags: testes, test, integração, erro


0
Oi ivgsilva,

saca este trecho:


void testSegundo(){

def userTest = new Usuario().save()

def coment1 = new Atendimento(descricao: "Primeiro ... W00t!")
userTest.addToAtendimentos(coment1) // linha 27: diz que o metodo .addToAtendimentos não pode ser incocado.
def coment2 = new Atendimento(descricao: "Segundo ... W00t!")
userTest.addToAtendimentos(coment2)
def coment3 = new Atendimento(descricao: "Terceiro ... W00t!")
userTest.addToAtendimentos(coment3)

assertEquals 3, Usuario.get(userTest.id).recados.size()

}


o método save() não retorna um novo objeto, ele apenas persiste a sua instancia de Usuario no banco de dados.

Sobre testes com Grails, já escrevi alguma coisa a respeito no meu blog que talvez te ajude.
http://www.itexto.net/devkico/?p=913


0
Já havia lido este texto seu texto Henrique. Eu estava testando os exemplos do livro 'Grails in Action'. Lá ele destaca que o save() retorna true quando consegue concluir a operação.

No testSegundo() vc sabe me dizer porque o teste (addToAtendimentos(coment1)) não funciona ?
19/07/2011 20:29


0
Oi ivgsilva, sei sim.

É porque o método save() sempre te retorna uma instância de Boolean, que não possui o método addToAtendimentos.

O método addToAdentimentos, pelo que pude observar no seu código, está presente na classe Usuario que você mesmo desenvolveu.

Vou comentar o seu código:


def userTest = new Usuario().save()


Neste primeiro passo, você definiu o valor da variavel userTeste como sendo do tipo Boolean (o método save() de uma classe de domínio sempre retorna um boolean, seja ele true ou false)


def coment1 = new Atendimento(descricao: "Primeiro ... W00t!")


Ok, nada de errado na criação do novo comentario


userTest.addToAtendimentos(coment1) // linha 27: diz que o metodo .addToAtendimentos não pode ser incocado.


Yeap, aqui você vai ter o erro, porque a classe Boolean não possui este método. Se você reescrevesse a sua primeira linha de código para algo como o código abaixo, no entanto, funcionaria.


def userTest = new Usuario()


sacou? Qualquer coisa, to ai!


0
Henrique muito obrigado pela sua explicação. Esta me ajudando a entender melhor o Grails.

realmente com relação ao testSegundo() sua dica fez o teste avançar.

Gostaria de aproveitar e fazer mais 2 perguntas:

1) Porque o comando "assertEquals 3, Usuario.get(userTest.id).atendimentos.size()" não funciona? Tentei substituir o size() por count() porém também não funcionou. Onde esta o erro nesta linha?

2) Porque o comando "assertNotNull userTest.save()" retorna NULL? tentei substitui-lo pelo comando "assertNotNull userTest.id" porém também não funcionou? Pensei que fosse porque o objeto encontrava-se vazio e tentei incluir "userTest.nome = 'Fulano'", mas deu erro com a mensagem que o objeto é nulo. Daí não entendi mais nada.

Eu vou migrar meus testes para a metodologia que você ensina em seu blog, porém eu fiquei com curiosidade em saber o porque que este comandos apresentaram estas falhas visto que eles foram ensinado no "Grails in Action".

Obrigado pela ajuda Henrique.

20/07/2011 23:09


0
Oi ivgsilva, bom: vamos lá!

Sobre a pergunta 1.
Há uma razão para isto: ou realmente não há 3 atendimentos no banco de dados ou não foi encontrado um usuário com o id que você passou.

Sobre a pergunta 2
Como disse, o método save() retorna pra você um valor booleano. Verificar se é não nulo, é portanto bobagem. Tente algo como


assertTrue userTest.save()


Qualquer coisa, to ai.
Grande abraço!



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto