Caso de Teste no VRaptor 3.1.3 não valida entidade com Hibernate Validations

3 respostas
king_of_gods

Criei alguns testes ontens para uma lógica que estou fazendo, e percebi que o validator.validade(...) não está validando os campos da entidade que estão com as annotations do Hibernate Validator.

Não sei se é alguma configuração errada.

Criei um projeto de teste só com Controller, Model e DAO mas sem o banco de dados ainda.

Seguem os códigos:

@Entity
public class Teste {
	
	@Column
	@Length(min=3)
	private String campo1;
	
	@Column
	@org.hibernate.validator.NotEmpty
	private String campo2;

	@Column
	@NotNull
	private String campo3;
	
	public Teste(){}
	
	public Teste(String campo1, String campo2, String campo3) {
		this.campo1 = campo1;
		this.campo2 = campo2;
		this.campo3 = campo3;
	}

	public String getCampo1() {
		return campo1;
	}

	public void setCampo1(String campo1) {
		this.campo1 = campo1;
	}

	public String getCampo2() {
		return campo2;
	}

	public void setCampo2(String campo2) {
		this.campo2 = campo2;
	}

	public String getCampo3() {
		return campo3;
	}

	public void setCampo3(String campo3) {
		this.campo3 = campo3;
	}
	
}
@Component
public class TesteDAO implements ITesteDAO{

	private Session session;
	
	public TesteDAO(Session session) {
		this.session = session;
	}
	
	public void save(Teste teste) {
		System.out.println(teste.toString());
	}
	
	public Session getSession() {
		return session;
	}

}
public interface ITesteDAO {
	public void save(Teste teste);
}
@Resource
public class TesteController {
	
	private final ITesteDAO testeDAO;
	private final Validator validator;
	private final Result result;
	
	public TesteController(Result result, Validator validator, ITesteDAO testeDAO) {
		this.result = result;
		this.validator = validator;
		this.testeDAO = testeDAO;
	}
	
	public void add(Teste teste) {
		validator.validate(teste);
		
		validator.onErrorUse(Results.logic()).forwardTo(TesteController.class).erro();
		
		testeDAO.save(teste);
		
		result.forwardTo(TesteController.class).sucesso();
	}
	
	public void erro() {
		System.out.println("erro");
	}

	public void sucesso(){
		System.out.println("sucesso");
	}
}
public class TesteControllerTest {
	
	private Mockery mockery;
	private TesteController testeController;
	private ITesteDAO testeDAO;
	
	@Before
	public void setUp() {
		mockery = new Mockery();
		
		testeDAO = mockery.mock(ITesteDAO.class);
		
		Validator validator = new MockValidator();
		Result result = new MockResult();
		
		testeController = new TesteController(result, validator, testeDAO);
	}
	
	@Test(expected=ValidationException.class)
	public void errorTest() {
		Teste teste = new Teste();
		
		errorTestExpectation(teste);
		
		testeController.add(teste);
		
	}
	
	public void errorTestExpectation(final Teste teste) {
		mockery.checking(new Expectations() {
			{
				never(testeDAO).save(teste);
			}
		});
	}
	
}

Só criei este projeto pra realmente saber se estava funcionando ou se era erro de configuração nos outros projetos.

Também não funcionou :\

3 Respostas

Lucas_Cavalcanti

o MockValidator é um Mock, ou seja, não tem implementações de verdade…

vc deveria testar a validação da entidade no teste da entidade, não no teste do controller… e usando o seu framework de validação (o MockValidator não pode só assumir que vc usa o HibernateValidator 3)

um jeito fácil de testar (no teste da entidade, não no controller) é criar:

ClassValidator<Entidade> validator = new ClassValidator<Entidade>(Entidade.class); // do hibernate validator
//...

validator.assertValid(entidade);
Lucas_Cavalcanti

uma dica:

no vraptor 3.1.3 vc pode usar:

validator.onErrorForwardTo(TesteController.class).erro();

e se vc quiser forçar um erro de validação, basta chamar:

validator.add(mockery.mock(Message.class));

antes de chamar o método do seu controller

G

No projeto vraptor-core há um package com os testes para o HibernateValidator e para a JSR303. A forma do teste desses componentes são diferentes desse, embora a tua intenção seja fazer testes no controller.

Penso que se você quer testar mesmo o HibernateValidator o correto seja fazer testes direto nos componentes dele, e não nos controllers.

Criado 7 de julho de 2010
Ultima resposta 7 de jul. de 2010
Respostas 3
Participantes 3