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

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:

[code]@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;
}

}
[/code]

[code]@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;
}

}[/code]

public interface ITesteDAO {
	public void save(Teste teste);
}[/code]

[code]@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");
	}
}

[code]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);
		}
	});
}

}[/code]

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 :\

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);

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

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.