Abaixo minha singela contribuição.
- Atualizei o sistema para o hibernate-distribution-3.6.0.Final
- Atualizei o sistema para o hibernate-validator-4.1.0.Final
- Removi a biblioteca ejb3-persistence-1.0.1.GA.jar ==> estava gerando o seguinte erro:
------------- ---------------- ---------------
Testcase: AdicionaComNomeNulo(br.com.admwagner.processos.controller.CadastroGeralControllerTest): Caused an ERROR
javax.persistence.Persistence.getPersistenceUtil()Ljavax/persistence/PersistenceUtil;
java.lang.NoSuchMethodError: javax.persistence.Persistence.getPersistenceUtil()Ljavax/persistence/PersistenceUtil;
at org.hibernate.validator.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:62)
at org.hibernate.
Test br.com.admwagner.processos.controller.CadastroGeralControllerTest FAILED
/dext3/home-java/processos/nbproject/build-impl.xml:1024: Some tests failed; see details above.
FALHA NA CONSTRUÇÃO (tempo total: 9 segundos)
Criei a seguinte Classe em um pacote utilitario:
package br.com.admwagner.util;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import br.com.caelum.vraptor.util.test.MockValidator;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import org.apache.log4j.Logger;
import br.com.caelum.vraptor.validator.ValidationMessage;
import br.com.caelum.vraptor.validator.ValidationException;
import javax.validation.Validation;
/**
*
* @author [email removido]
*/
public class MockValidatorHibernate extends MockValidator {
private Validator validator;
private static final Logger log = Logger.getLogger(MockValidatorHibernate.class);
public MockValidatorHibernate() {
validator = Validation.buildDefaultValidatorFactory().getValidator();
}
@Override
public void validate(Object bean) {
log.debug("------------------------------------------ inicio validate ");
final Set<ConstraintViolation><Object>> violations = validator.validate(bean);
for (ConstraintViolation<Object> constraintViolation : violations) {
add(new ValidationMessage(constraintViolation.getMessage(), constraintViolation.getMessageTemplate().replaceAll("[{}]", "")));
}
if (!getErrors().isEmpty()) {
log.debug("---------" + getErrors().size() + " mensagens de erros foram identificadas!! - ATENÇÃO!");
// se encontrou erros na validação dispara a Exception que será verificada no test
throw new ValidationException(getErrors());
}
}
}
Classe de teste
package br.com.admwagner.processos.controller;
import java.util.List;
import org.apache.log4j.Logger;
import br.com.caelum.vraptor.util.test.MockResult;
import br.com.admwagner.processos.dao.CadastroGeralDao; // importando o dao real (não usei o mock ainda)
import br.com.admwagner.processos.model.CadastroGeral;
import br.com.admwagner.util.MockValidatorHibernate; // Mock ora implementado.
import br.com.caelum.vraptor.validator.ValidationException;
import org.hibernate.SessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
/**
*
* @author admwagner
*/
public class CadastroGeralControllerTest {
private static final Logger log = Logger.getLogger(CadastroGeralControllerTest.class);
private Session session;
private CadastroGeralDao dao;
private MockResult result;
private CadastroGeralController controller;
private MockValidatorHibernate validator;
public CadastroGeralControllerTest() {
}
@Before
public void setUp() throws Exception {
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory factory = cfg.buildSessionFactory();
session = factory.openSession();
session.beginTransaction();
dao = new CadastroGeralDao(session);
result = new MockResult();
validator = new MockValidatorHibernate();
controller = new CadastroGeralController(dao, validator, result);
}
@After
public void tearDown() throws Exception {
if (session != null && session.getTransaction().isActive()) {
session.getTransaction().rollback();
}
}
@Test
public void AdicionarNovoCadastroSemErros(){
CadastroGeral cad = new CadastroGeral("teste nome", "[telefone removido]");
controller.adiciona(cad);
String resultado;
resultado = result.included("alerta");
assertTrue(resultado.length()>0);
assertTrue(dao.existeCadastroPorCpfCnpj("[telefone removido]"));
}
@Test(expected=ValidationException.class) // se houve erro na validação a classe MockValidatorHibernate irá gerar uma Exception
public void AdicionaCadastroComNomeNuloGeraErro(){
CadastroGeral cad = new CadastroGeral( );
cad.setCpfcnpj("[telefone removido]");
controller.adiciona(cad);
}
}
O Model:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.admwagner.processos.model;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Id;
import org.hibernate.validator.constraints.NotEmpty;
/**
*
* @author admwagner
*/
@Entity
public class CadastroGeral implements Serializable {
private static final long serialVersionUID = 5969734540775236852L;
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
@NotEmpty(message="item obrigatorio")
private String nome;
private String cpfcnpj;
public CadastroGeral() { }
public CadastroGeral(String id, String nome, String cpfcnpj) {
this.id = id;
this.nome = nome;
this.cpfcnpj = cpfcnpj;
}
public CadastroGeral(String nome, String cpfcnpj) {
this.nome = nome;
this.cpfcnpj = cpfcnpj;
}
public CadastroGeral(String nome) {
this.nome = nome;
}
public String getCpfcnpj() {
return cpfcnpj;
}
public void setCpfcnpj(String cpfcnpj) {
this.cpfcnpj = cpfcnpj;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final CadastroGeral other = (CadastroGeral) obj;
if ((this.id == null) ? (other.id != null) : !this.id.equals(other.id)) {
return false;
}
if ((this.nome == null) ? (other.nome != null) : !this.nome.equals(other.nome)) {
return false;
}
if ((this.cpfcnpj == null) ? (other.cpfcnpj != null) : !this.cpfcnpj.equals(other.cpfcnpj)) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 7;
hash = 79 * hash + (this.id != null ? this.id.hashCode() : 0);
hash = 79 * hash + (this.nome != null ? this.nome.hashCode() : 0);
hash = 79 * hash + (this.cpfcnpj != null ? this.cpfcnpj.hashCode() : 0);
return hash;
}
}
O controller:
package br.com.admwagner.processos.controller;
import br.com.admwagner.processos.dao.CadastroGeralDao;
import br.com.admwagner.processos.model.CadastroGeral;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import java.util.List;
import org.apache.log4j.Logger;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author admwagner
*/
@Resource
public class CadastroGeralController {
private CadastroGeralDao dao;
private Validator validator;
private Result result;
//private static final Logger log = Logger.getLogger(CadastroGeralController.class);
public CadastroGeralController(CadastroGeralDao dao, Validator validator, Result result ) {
this.dao = dao;
this.validator = validator;
this.result = result;
}
@Path("/cadastrogeral")
@Get
public void lista() {
List<CadastroGeral> listaCad = this.dao.listAll();
result.include("lista", listaCad);
}
@Path("/cadastrogeral")
@Post
public void adiciona(final CadastroGeral cadastro) {
validator.validate(cadastro);
validator.onErrorUsePageOf(this).formulario();
this.dao.saveOrUpdate(cadastro);
result.include("alerta", "Cadastro " + cadastro.getNome() + " adicionado com sucesso.");
result.redirectTo(this).lista();
}
@Path("/cadastrogeral/novo")
@Get
public void formulario() {}
}
Testes ok…
Obrigado ao Lucas e ao leandros pela atenção!
Talves fosse interessante incluir este mock no VRaptor…