Powered by Max Banner Ads 

Usando @SecondaryTable Hibernate

January 26th, 2012 No comments

Olá Pessoal,

O post de hoje vou mostrar como mapear duas tabelas em um bean do Hibernate. O motivo é que você não quer criar um bean para cada tabela, e precisa apenas ler algumas colunas de uma outra. E quer tudo no mesmo bean.

Lets go…

Contexto
Vamos supor que você tem o cenário a seguir :

E você precisa ler informações tanto da tabela infraestrutura e logicalserserver e ter tudo em um bean.

Desenvolvimento

Vou fazer um DAO bem simples somente para focarmos mais no proposito do post. Estou considerando que você já conhece o Hibernate e portanto toda aquela parte de config e  e .jars do framework não serão apresentados, caso tenha dúvida como fazer veja outros posts na categoria Hibernate do blog.

A seguir temos o nosso projeto:

 

DAO
A seguir temos nosso DAO:
public class DAO {
private static final ThreadLocal threadLocal = new ThreadLocal();
private static final SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

public static Session getSession(){
Session session = (Session) threadLocal.get();
if (session==null) {
session = sessionFactory.openSession();
}
return session ;
}
public void begin(){
getSession().getTransaction().begin();
}
public void commit(){
getSession().getTransaction().commit();
}
public void rollback(){
getSession().getTransaction().rollback();
}
}

O bean
Agora temos o nosso bean, onde mapeamos com as duas tabelas:

@Entity
@Table(name=”infraestrutura”)
@SecondaryTable(name=”logicalserver”)
public class InfraServer {
@Id
@Column(name=”infra_id”)
private int infraId;
@Column(name=”name_infra”)
private String nameInfra;
@Column(name=”nameServer”,table=”logicalserver”)
private String nameServer;
public int getInfraId() {
return infraId;
}
public void setInfraId(int infraId) {
this.infraId = infraId;
}
public String getNameInfra() {
return nameInfra;
}
public void setNameInfra(String nameInfra) {
this.nameInfra = nameInfra;
}
public String getNameServer() {
return nameServer;
}
public void setNameServer(String nameServer) {
this.nameServer = nameServer;
}
}

@SecondaryTable: Essa é a anotação que possibilita mapearmos  uma segunda tabela para o mesmo bean. Nada de especial nela, apenas informamos o nome da tabela que desejamos:

@SecondaryTable(name=”logicalserver”)

Agora precisamos informar qual coluna pertence a segunda tabela. Quando não informado o Hibernate vai considerar sempre o mapeamento que temos para @Table.

@Column(name=”nameServer”,table=”logicalserver”)
private String nameServer;

MainDAO
Crie uma classe com o método main que vai ler os dados da tabela e imprimir. Nada de especial que um simples HQL:
public class MainDAO  extends DAO{
public static void main(String[] args) {
List<InfraServer> retrieve = retrieve();

for (InfraServer infraServer : retrieve) {
System.out.println(infraServer.getNameInfra());
System.out.println(infraServer.getNameServer());
}    }

public static List<InfraServer> retrieve(){
Query query = getSession().createQuery(“from InfraServer”);
return query.list();
}
Ao rodar obtemos o seguinte resultado:

Respectivamente temos a tabela: logicalserver, infraestrutura e o console do Eclipse.

É isso ai pessoal, bem simples fazer um bean mapear duas tabelas. No próximo post veremos como fazer isso para mais de uma tabela a partir do mesmo bean.
Abracos, see ya!

Tags:

Criando Mocks com Mockito

January 15th, 2012 No comments

olá Pessoal,

No post de hoje vamos ver como usar o API Mockito para criação de objetos mocks. No ultimo post vimos o que são mocks, mas eu já tinha falado rapidamente do Mockito. Usarei o mesmo exemplo visto no post passado, porém agora teremos mocks in action.

Lets go…

Usando JUnit com o Mockito

Para não ter que repetir o código anterior, neste post adicionei apenas a classe que tem o unit test. Então, vou considerar que você viu o nosso post sobre Mocks.

Agora precisamos testar a classe AlugaCarro e ver se de fato ela está retornando um objeto que possui as informações que esperamos que tenha.

Classe de teste

publicclass CarroAlugadoTest {

@Mock

private AlugaCarro alugaCarro;//my interface

public CarroAlugadoTest() {

alugaCarro = Mockito.mock(Cliente.class);

}

@Test

publicvoid alugaCarroParaCliente(){

//o caraquerecebeoscarrosalugados

CarroAlugado car = new CarroAlugado(alugaCarro);

String resultadoEsperado = “Camilo Golf”;

/*

* aqui o clientecamiloestáreservando o carro golf

*/

Mockito.when(alugaCarro.getNomeCliente()).thenReturn(“Camilo “);

Mockito.when(alugaCarro.getModeloCarro()).thenReturn(“Golf”);

String verdadeiroResultado = car.getAlugaCarro().getNomeCliente() + car.getAlugaCarro().getModeloCarro();

Mockito.verify(alugaCarro).getNomeCliente();

assertEquals(resultadoEsperado,verdadeiroResultado);

}

Explicado partes importantes do código

Passo 1

Precisamos fazer a mock,ou seja, “mockar” uma classe/interface, há várias formas de fazer isso, usaremos o modo mais simples, que é usar annotations @Mock na variável que vai ser o objeto e “instanciar” ela no construtor, pois quando a classe for carregada a variável será “mockada”.

@Mock

private AlugaCarro alugaCarro;

public CarroAlugadoTest() {

alugaCarro = Mockito.mock(Cliente.class);

}

Passo 2

Criamos um teste onde vamos verificar se um carro foi alugado para o cliente.

Primeiro passo foi passar o objeto “mockado” que representa “o cliente” para a classe CarroAlugado, pois é isso que ela espera receber, um objeto que alugou um carro.

  1. CarroAlugado car = new CarroAlugado(alugaCarro);

Em seguida vamos configurar os valores para o método que recebe o nome do cliente e o que recebe o nome do carro alugado. Porém, aqui usaremos API Mockito. Essa linha de código será executada quando o método for invocado.

  1. Mockito.when(alugaCarro.getNomeCliente()).thenReturn(“Camilo “);
  2. Mockito.when(alugaCarro.getModeloCarro()).thenReturn(“Golf”);

A leitura poderia ser algo do tipo: “quando o metodo getNomeCliente() for chamado, então configure o valor dele para “camilo”.

Na linha seguinte, observe que chamamos os métodos, que acreditamos estarem com um valor. E ai o mockito entra in action, quando um objeto, chama um daqueles métodos, ele configura os valores que estão no thenReturn().

  1. String verdadeiroResultado = car.getAlugaCarro().getNomeCliente() + car.getAlugaCarro().getModeloCarro();
  2. Mockito.verify(alugaCarro).getNomeCliente();

O método verify() apenas verifica se o método foi chamado, no API Docs do Mockito, há outras pessoas de verificação, como por exemplo:

  • verificar se o metodo getNomeCliente() foi chamado pelo menos 1 vez, ou mais vezes;
  • verificar se nunca foi chamado.

O assertEquals é somente para verificar se estamos recebendo o valor esperado.

Outro teste que foi implementado:

@Test

publicvoid verificaSeUmMetodoNuncaFoiExecutado(){

CarroAlugado carroAlugado = new CarroAlugado(alugaCarro);

Mockito.when(alugaCarro.getModeloCarro()).thenReturn(“Civic”);

//verificase o metodo getNomeCliente() nuncafoiexecutado

String modeloCarro = carroAlugado.getAlugaCarro().getModeloCarro();

Mockito.verify(alugaCarro, Mockito.never()).getNomeCliente();

}

Um video

Um video do Vinicius mostra a diferença entre mock & Stubs que achei muito bom.

http://viniciusquaiato.com/blog/diferenca-entre-mocks-e-stubs/

Conclusão

Uma outra dica é você gastar um bom tempo ali na documentação do Mockito, ela é bastante rica e de fácil leitura. A API não é tão grande e muito menos complexa, basta um pouco de pratica e sabendo como usar cada recurso, tá feito.

Vou ficando por aqui e espero que tenham gostado do post.

Abracos, see ya!

Related Posts with Thumbnails
Tags: , , ,