Testes unitários - Bean Validation

252 views
Skip to first unread message

Renan Montenegro

unread,
Jun 6, 2014, 10:39:32 PM6/6/14
to caelum-...@googlegroups.com
Para que eu possa realizar os testes unitários das validações feitas através do Bean Validation, preciso levantar o contexto do CDI no teste, é isso mesmo ?

Grato.

Renan Montenegro

unread,
Jun 6, 2014, 10:40:00 PM6/6/14
to caelum-...@googlegroups.com
Lembrando que estou utilizando VRaptor 4.

Rodrigo Turini

unread,
Jun 7, 2014, 8:20:10 PM6/7/14
to caelum-...@googlegroups.com
Oi Renan! Você não precisa subir o CDI pra testar as validações.
No setUp dos seus testes você pode fazer algo como:

@BeforeClass
public static void setUp() {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    validator = factory.getValidator();
}

Depois nos seus testes você chama o validate e faz um assert do
set de ConstraintViolation's que ele retorna. Faz sentido? abraços

Rodrigo Turini
Caelum | Ensino e Inovação
www.caelum.com.br



Em 6 de junho de 2014 23:39, Renan Montenegro <rena...@gmail.com> escreveu:
Lembrando que estou utilizando VRaptor 4.


Em 6 de junho de 2014 23:39, Renan Montenegro <rena...@gmail.com> escreveu:

Para que eu possa realizar os testes unitários das validações feitas através do Bean Validation, preciso levantar o contexto do CDI no teste, é isso mesmo ?

Grato.

--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
To unsubscribe from this group and stop receiving emails from it, send an email to caelum-vrapto...@googlegroups.com.
To post to this group, send email to caelum-...@googlegroups.com.
Visit this group at http://groups.google.com/group/caelum-vraptor.
For more options, visit https://groups.google.com/d/optout.

Renan Montenegro

unread,
Jun 7, 2014, 8:28:49 PM6/7/14
to caelum-...@googlegroups.com

Quando chegar em casa darei uma olhada com mais calma. Qualquer coisa posso até acrescentar na documentação  sobre testes.

E desde já obrigado pelas dicas e ajuda na documentação. ;-)

Renan Montenegro

unread,
Jun 7, 2014, 8:35:08 PM6/7/14
to caelum-...@googlegroups.com

Rodrigo, mas isso é preciso para o caso dos testes de validação com o Bean Validaton, não é ?

Abraço

Rodrigo Turini

unread,
Jun 7, 2014, 8:49:27 PM6/7/14
to caelum-...@googlegroups.com
Isso! O que exatamente você quer testar? []'s

Rodrigo Turini
Caelum | Ensino e Inovação
www.caelum.com.br



Renan Montenegro

unread,
Jun 7, 2014, 8:57:16 PM6/7/14
to caelum-...@googlegroups.com

Esquecendo um pouco os testes, supondo que o parâmetro do meu método está anotado com @NotNull @Valid e dentro do método eu coloco validator.onError....

Só isso já é o suficiente para fazer a validação com o Bean Validation ? Se sim, que exceção é lançada?

Na documentação fala como se só isso seja o suficiente...

Grato.

Rodrigo Turini

unread,
Jun 7, 2014, 9:03:52 PM6/7/14
to caelum-...@googlegroups.com
​Sim, basta anotar e usar o @Valid (ou chamar o método validate)
Quanto a exception, se você não tratar (tipo usando onError...)​, vai 
receber uma ConstraintViolationException. Nos testes você pode
usar o MockValidator e verificar a lista de erros/constraints. abraços

Rodrigo Turini
Caelum | Ensino e Inovação
www.caelum.com.br



Renan Montenegro

unread,
Jun 8, 2014, 1:08:03 AM6/8/14
to caelum-...@googlegroups.com
Rodrigo, não estou conseguindo capturar a lista de erros/constraints com o MockValidator quando estou fazendo validação com o Bean Validation.

Abraço

Renan Montenegro

unread,
Jun 8, 2014, 2:13:56 AM6/8/14
to caelum-...@googlegroups.com

Renan Montenegro

unread,
Jun 8, 2014, 3:02:06 AM6/8/14
to caelum-...@googlegroups.com

No entanto da outra forma que você falou usando o ValidatorFactory e nos meus testes chamando o validate, da certo.

Chico Sokol

unread,
Jun 8, 2014, 7:48:07 AM6/8/14
to caelum-vraptor

Renan, será que faz sentido fazer esse tipo de teste? Você vai basicamente testar se a implementação de bean validation que vc está usando funciona como esperado e se sua classe está anotada corretamente

Renan Montenegro

unread,
Jun 8, 2014, 8:04:55 AM6/8/14
to caelum-...@googlegroups.com
Chico, exatamente, talvez testar se a implementação de bean validation está funcionando como esperado realmente não faça sentido, no entanto um teste para garantir que minha classe esteja anotada corretamente talvez sim, pois tenho a garantia das validações que devem ser feitas, assim não corro o risco de alguém um dia "remover" uma anotação e quebrar em algum outro método que também precise dessa validação.

Mas claro, isso é apenas uma visão que tenho e que nunca passei por uma situação que realmente precisasse, apenas estou fazendo alguns testes aprofundando no VRaptor 4 e me deparei com essa situação.

Chico Sokol

unread,
Jun 8, 2014, 8:08:59 AM6/8/14
to caelum-vraptor

Você pode usar reflection pra fazer assert nos atributos anotados. Mas mesmo assim esse tipo de teste não faz muito sentido pra mim.

Renan Montenegro

unread,
Jun 8, 2014, 8:16:13 AM6/8/14
to caelum-...@googlegroups.com
Como disse, é apenas uma visão mais supérflua, não passei por nenhuma situação real que precisasse disso. E com isso pensei que seria apenas um plus para o MockValidator, poder capturar a lista de erros/constraints.

Mas realmente, pensando bem, talvez não faça sentido testar o Bean Validation, pois podemos as implementações já são devidamente testadas.

Já pensando na validação com o Validator do próprio VRaptor, faça sentido para garantirmos que as validações que estamos fazendo estejam sendo a que esperamos.

Renan Montenegro

unread,
Jun 8, 2014, 8:19:22 AM6/8/14
to caelum-...@googlegroups.com
 Mas validação com o Validator do próprio VRaptor é simples e conseguimos testar perfeitamente. :-)

Renan Montenegro

unread,
Jun 8, 2014, 8:30:10 AM6/8/14
to caelum-...@googlegroups.com
De qualquer forma, valeu. :-)

Rafael Ponte

unread,
Jun 8, 2014, 10:25:37 AM6/8/14
to caelum-...@googlegroups.com
Olá, eu concordo com o Renan. 

Sinceramente, eu diria que vale a pena sim verificar se as validações estão devidamente definidas. Principalmente por se tratar de uma validação que pode ser invocada em qualquer camada da aplicação, como é o bean validations. 

Dizer que não faz sentido é o mesmo que dizer que testar a validação dentro do controller do vraptor não vale a pena, mas sabemos que vale. 

Se testamos dentro do controller ou fora é outra estória e discutível. Não tenho uma opinião definida sobre isso ainda. 
--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
To unsubscribe from this group and stop receiving emails from it, send an email to caelum-vrapto...@googlegroups.com.
To post to this group, send email to caelum-...@googlegroups.com.
Visit this group at http://groups.google.com/group/caelum-vraptor.
For more options, visit https://groups.google.com/d/optout.


--
Rafael Ponte
TriadWorks | Formação Java
http://cursos.triadworks.com.br

Renan Montenegro

unread,
Jun 8, 2014, 10:44:17 AM6/8/14
to caelum-...@googlegroups.com
Pois é, para mim também faz sentido, como o Rafael Ponte falou, por se tratar de uma validação que pode ser invocada em qualquer camada da aplicação.

Concordo também quando ele diz:
Dizer que não faz sentido é o mesmo que dizer que testar a validação dentro do controller do vraptor não vale a pena, mas sabemos que vale.

Acho que se o VRaptor faz a validação em cima do Bean Validation, o MockValidator deveria trabalhar também dessa forma, para que pudéssemos testarmos com facilidade assim como testamos quando fazemos a validação com próprio Validator do VRaptor.

Otávio Garcia

unread,
Jun 8, 2014, 11:13:15 AM6/8/14
to caelum-...@googlegroups.com
Fazer sentido faz mesmo, Rafael Ponte, já que eles garantem a integridade do objeto. Se um campo CPF é obrigatório e será usado em vários locais, é bom mesmo garantir que ninguém arranque essa validação fora.

Mas neste caso não tem como fugir de ter uma instância do Bean Validation, já que "mockar" as validações são bem complicadas. Então eu faria que nem os testes de DAO: sobe uma instância do Hibernate Validator e valida os beans.

A idéia do mock do Bean Validation que tem no vraptor é quando você quer testar alguma coisa mas fazendo um "bypass" nas validações de beans. Então como a intenção do Renan é testar a validação, não dá para usá-lo.


Renan Montenegro

unread,
Jun 8, 2014, 11:20:50 AM6/8/14
to caelum-...@googlegroups.com
Pois é Otávio, usando a forma que o Rodrigo falou, funciona de boa:

@BeforeClass
public static void setUp() {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    validator = factory.getValidator();
}
Depois nos seus testes você chama o validate e faz um assert do
set de ConstraintViolation's que ele retorna. 

A minha curiosidade era se não teria uma foma de fazer isso com o MockValidator.

Mas agora ficou claro Otávio.

Obrigado. :-)

Otávio Garcia

unread,
Jun 8, 2014, 11:22:18 AM6/8/14
to caelum-...@googlegroups.com
É desta forma mesmo que você deve fazer se você quer validar os beans. o MockValidator é quando você quer fazer um bypass na validação.

Renan Montenegro

unread,
Jun 8, 2014, 11:28:50 AM6/8/14
to caelum-...@googlegroups.com
É que usando o MockValidator, eu posso fazer meu teste com um @Test(expected=ValidationException.class), pois quando uso o validator.onError..., ele lança o ValidationException.

Pensei que poderia esperar o mesmo quando usando o Bean Validation, já que o erro é tratado também com o validator.onError...

Otávio Garcia

unread,
Jun 8, 2014, 11:32:19 AM6/8/14
to caelum-...@googlegroups.com
A nossa classe que faz a validação não lança uma exception, ela adiciona no ${errors} para que você possa pegá-los na view.

O que você pode fazer é pegar a lists de erros e ver se tem a sua mensagem lá.

Renan Montenegro

unread,
Jun 8, 2014, 11:40:50 AM6/8/14
to caelum-...@googlegroups.com
Fala Otávio,

quando faço um teste com o próprio Validator do VRaptor, eu posso usar dessa forma:

@Test(expected = ValidationException.class)
public void shouldThrowValidationException() {
     controller.add(new Pessoa());
}

Nos testes que fiz, essa ValidationException é lançada quando o validator.onError... for chamado, pelo menos era assim que funcionava no VRaptor 3 e nos testes que fiz no 4 também acontece isso, desde que eu use a validação do próprio VRaptor.

Renan Montenegro

unread,
Jun 8, 2014, 11:48:09 AM6/8/14
to caelum-...@googlegroups.com
Acredito que aconteça o mesmo quando se usa Bean Validations quando estou usando a implementação real do Validator. Porém com o MockValidator, ele lança essa exceção quando pega algum erro de validação do próprio Validator do VRaptor, mas com o Bean Validation não acontece o mesmo.

Renan Montenegro

unread,
Jun 8, 2014, 11:58:34 AM6/8/14
to caelum-...@googlegroups.com
Na verdade o MockValidator que lança essa exceção, não a implementação real. :P

Renan Montenegro

unread,
Jun 8, 2014, 4:42:28 PM6/8/14
to caelum-...@googlegroups.com
Estava dando uma olhada, antes era possível fazer esse tipo de teste no VRaptor 3 com essa classe aqui ? Tinha um objeto Mock para trabalhar com os testes do Bean Validation ? Se sim, por que hoje não é possível ?

Renan Montenegro

unread,
Jun 8, 2014, 5:45:30 PM6/8/14
to caelum-...@googlegroups.com
Galera, criei uma classe chamada MockBeanValidator bem parecida com essa, senão igual, onde sobrescrevi o método validate do MockValidator...

Fiz os testes unitários e com isso consegui lançar a exceção ValidationException e capturar os erros...

Para isso basta eu colocar o validator.validate no controller ou então caso o método do controller esteja anotado com @Valid, no meu chamo o validate do MockBeanValidator que criei.

Meu teste ficou assim:

public class PessoaControllerTest {

private MockBeanValidator validator;
private PessoaController controller;
@Before
public void setUp() {
validator = new MockBeanValidator();
controller = new PessoaController(validator);
}

@Test
public void shouldThrowValidationException() {
Pessoa pessoa = new Pessoa();
try {
controller.add(pessoa);
} catch (ValidationException e) {
List<Message> erros = validator.getErrors();
//trata erros
}
}
}

Gerei um pacorte do VRaptor para testar e funcionou tudo normal...
Será se não seria interessante fazer essa mesma implementação que havia no VRaptor 3, colocar na versão 4 ?

Abraços

Renan Montenegro

unread,
Jun 8, 2014, 6:04:19 PM6/8/14
to caelum-...@googlegroups.com
Criei esse Pull Request: https://github.com/caelum/vraptor4/pull/583

Se for de interesse... :-)

Otávio Garcia

unread,
Jun 9, 2014, 12:50:16 AM6/9/14
to caelum-...@googlegroups.com
MockValidator dá a idéia de que você não tem uma classe real, mas sim um mock. Um mock é algo que simula mas que não é. Se no MockValidator validarmos usando uma implementação real do Bean Validation, então não é um mock. Para isso você deve usar a DefaultValidator.

Note que a implementação da MockValidator apenas retorna um this para o chainning. Isso porque a idéia é que ela seja um "falso validador". Ela é útil quando você quer testar seu controller fazendo um bypass na validação.

Renan Montenegro

unread,
Jun 9, 2014, 12:53:20 AM6/9/14
to caelum-...@googlegroups.com
Tem razão Otávio.
Então acha melhor fechar a issue ou tentar melhorar a classe ?


Em 9 de junho de 2014 01:49, Otávio Garcia <ota...@otavio.com.br> escreveu:
MockValidator dá a idéia de que você não tem uma classe real, mas sim um mock. Um mock é algo que simula mas que não é. Se no MockValidator validarmos usando uma implementação real do Bean Validation, então não é um mock. Para isso você deve usar a DefaultValidator.

Note que a implementação da MockValidator apenas retorna um this para o chainning. Isso porque a idéia é que ela seja um "falso validador". Ela é útil quando você quer testar seu controller fazendo um bypass na validação.

--

Otávio Garcia

unread,
Jun 9, 2014, 12:56:22 AM6/9/14
to caelum-...@googlegroups.com
Vamos esperar o pessoal dar mais uma opinião, pois eu não lembro porque removemos essa classe. Faz muito tempo :)

Renan Montenegro

unread,
Jun 9, 2014, 12:57:14 AM6/9/14
to caelum-...@googlegroups.com
Ok Otávio...

Obrigado. :-)

Renan Montenegro

unread,
Jun 9, 2014, 1:02:33 AM6/9/14
to caelum-...@googlegroups.com
Realmente, talvez não da para fazer uma class Mock de verdade para o Bean Validation, pois mesmo o DefaulValidatior usa uma implementação real, então mesmo que usássemos ela, cairíamos no mesmo problema. :-)

Renan Montenegro

unread,
Jun 9, 2014, 7:41:06 AM6/9/14
to caelum-...@googlegroups.com
Depois dessa discussão e ler esse post: http://www.guj.com.br/java/299021-vraptor-teste-de-validacao-hibernate estou convencido que esse teste deve ser feito no modelo e não no controller, já que estamos testando annotations presente no model. :-)

Rodrigo Turini

unread,
Jun 9, 2014, 8:22:29 AM6/9/14
to caelum-...@googlegroups.com
Boa Renan! (e perdão pela demora pra responder, mas o pessoal já 
explicou bem). Concordo com sua conclusão, já fechei a issue. []'s

Rodrigo Turini
Caelum | Ensino e Inovação
www.caelum.com.br



Renan Montenegro

unread,
Jun 9, 2014, 8:24:26 AM6/9/14
to caelum-...@googlegroups.com
Obrigado Rodrigo.

E desculpa pela insistência no mesmo e consequentemente o Pull Request desnecessário. rsrs

Rodrigo Turini

unread,
Jun 9, 2014, 8:32:24 AM6/9/14
to caelum-...@googlegroups.com
Imagina Renan, esse é o propósito da lista. 
Pergunte sempre e insista enquanto não estiver 100% claro =)

Rodrigo Turini
Caelum | Ensino e Inovação
www.caelum.com.br



Renan Montenegro

unread,
Jun 9, 2014, 8:32:56 AM6/9/14
to caelum-...@googlegroups.com
Valeu Rodrigo. :-)

Otávio Garcia

unread,
Jun 9, 2014, 8:40:35 AM6/9/14
to caelum-...@googlegroups.com

Concordo. Esse é um local para que possamos discutir dúvidas, idéias, etc. E com elas todos nos aprendemos muito.

Abraço

Renan Montenegro

unread,
Jun 9, 2014, 9:02:14 AM6/9/14
to caelum-...@googlegroups.com
Por sinal ultimamente tenho aprendido muuito com vocês. rsrs

Mais uma vez obrigado. :-)
Reply all
Reply to author
Forward
0 new messages