sábado, 24 de abril de 2010

Testes Unitários Usando Injeção de Dependência

Mostrarei um simples exemplo usando testes unitários na linguagem Java. O nome da minha classe é Bairro e vai usar hibernate como framework de persistência.

Para fazer a injeção de dependência usarei neste exemplo o framework Spring. Mas fique a vontade para escolher outro framework conforme linguagem e gosto.

O pojo de Bairro

@Entity

@Table(name = "bairro")

public class Bairro {

    @Id

    @GeneratedValue

    @Column(name = "id", nullable = false)

    private Long id;

    @Column(name = "nome")

    private String nome;

    public Long getId() {

        return id;

    }

    public void setId(Long id) {

        this.id = id;

    }

    public String getNome() {

        return nome;

    }

    public void setNome(String nome) {

        this.nome = nome;

    }

}

Aqui tenho a interface BairroDAO com operações simples do CRUD

public interface BairroDAO {

    public boolean criar(Bairro b);

    public boolean deletar(Long id);

    public boolean atualizar(String nome, Long id);

    public Bairro load(Long id);

}

Implementação da interface usando Hibernate

public class BairroDAOImpl implements BairroDAO {

    public boolean criar(Bairro b) {

        boolean retorno = false;

        Session session = HibernateUtil.getSessionFactory().openSession();

        Transaction transaction = session.beginTransaction();

        try {

            session.save(b);

            transaction.commit();

            retorno = true;

        } catch (HibernateException e) {

            retorno = false;

            transaction.rollback();

        } finally {

            session.close();

        }

        return retorno;

    }

    public boolean deletar(Long id) {

        boolean retorno = false;

        Session session = HibernateUtil.getSessionFactory().openSession();

        Bairro b = (Bairro) session.load(Bairro.class, id);

        Transaction transaction = session.beginTransaction();

        try {

            session.delete(b);

            transaction.commit();

            retorno = true;

        } catch (HibernateException e) {

            retorno = false;

            transaction.rollback();

        } finally {

            session.close();

        }

        return retorno;

    }

    public boolean atualizar(String nome,Long id) {

        boolean retorno = false;

        Session session = HibernateUtil.getSessionFactory().openSession();

Bairro b = (Bairro) session.load(Bairro.class, id);

        b.setNome(nome);

Transaction transaction = session.beginTransaction();

        try {

            session.update(b);

            transaction.commit();

            retorno = true;

        } catch (HibernateException e) {

            retorno = false;

            transaction.rollback();

        } finally {

            session.close();

        }

        return retorno;

    }

public Bairro load(Long id) {

        Bairro bairro = null;

Session session = HibernateUtil.getSessionFactory().openSession();

bairro = (Bairro) session.load(Bairro.class, id);

        session.close();

        return bairro;

    }

}

O hibernate.cfg.xml do hibernate para mostrar o devido mapeamento do pojo Bairro

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC

        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

<!--  Database connection settings –>

<property name="hibernate.connection.driver_class">

        com.mysql.jdbc.Driver

    </property>

   <property name="hibernate.connection.url">

        jdbc:mysql://localhost/java

    </property>

    <property name="hibernate.connection.username">root</property>

<!--  SQL dialect -->

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<!--  JDBC connection pool (use the built-in) -->

<property name="connection.pool_size">2</property>

<!--  Enable Hibernate's current session context -->

<property name="current_session_context_class">thread</property>

<!--  Disable the second-level cache  -->

<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

<!--  Echo all executed SQL to stdout –->

<property name="show_sql">true</property>

<property name="hbm2ddl.auto">none</property>

<mapping class="…Bairro"/>

</session-factory>

</hibernate-configuration>

Classe de negócios que vai realizar as operações em bairro e vai ser usado na classe de teste

A classe de negócios depende da classe BairroDAOImpl. Mas estou usando a interface BairroDAO. Como realizarei a ligação com classe  BairroDAOImpl? Precisarei da injeção de dependência que será feita no serviço setBairroDAO e com ajuda do framework Spring.

public class BairroBusinessRules {

    private BairroDAO bairroDAO;

    public BairroBusinessRules() {

        super();

        // TODO Auto-generated constructor stub

    }

    public void setBairroDAO(BairroDAO bairroDAO) {

        this.bairroDAO = bairroDAO;

    }

    public boolean criar(Bairro b){

        return this.bairroDAO.criar(b);

    }

    public boolean deletar(Long id){

        return this.bairroDAO.deletar(id);

    }

    public boolean atualizar(String nome, Long id){

        return this.bairroDAO.atualizar(nome, id);

    }

    public Bairro load(Long id){

        return this.bairroDAO.load(id);

    }

}

Mapeamento no Spring da injeção de dependência

Classe BairroBusinessRules depende de BairroDAOImpl. Faço a injeção de dependência através da atribuição do myBairro (instância de BairroDAOImpl) para atributo bairroDAO da classe BairroBusinessRules.

<bean id="myBairro" class="....BairroDAOImpl"/>

<bean id="bairroBusinessRules" class="….BairroBusinessRules">

            <property name="bairroDAO" ref="myBairro"/> 

   </bean>

Classe de testes

Note que estou pegando BairroBusinessRules através do Spring, fazendo isto estou desencadeando a injeção de dependência descrita no XML do mapeamento do Spring:

public class TestBairro2 extends TestCase {

    private BairroBusinessRules testBairro;

    public void setUp() throws Exception {

        ApplicationContext factory = new ClassPathXmlApplicationContext("contextApplication.xml");

        this.testBairro = (BairroBusinessRules) factory.getBean ("bairroBusinessRules");

    }

@Test

    public void testCriar() throws Exception {

        Bairro b = new Bairro();

        b.setNome("Anchieta");

        Bairro b1 = new Bairro();

        b1.setNome("Boa Vista");

        Assert.assertTrue(testBairro.criar(b));

        Assert.assertTrue(testBairro.criar(b1));

         b1.setNome("cristo redentor");

         Assert.assertTrue(testBairro.criar(b1));

    }

    @Test

    public void testDeletar() throws Exception {

        Assert.assertTrue(testBairro.deletar(new Long(20)));

    }

    @Test

    public void testAtualizar() throws Exception {

        Assert.assertTrue(testBairro.atualizar("Humaita",new Long(14)));

    }

    @Test

    public void testLoadNotNull() throws Exception {

        Assert.assertNotNull(testBairro.load(new Long(16)));

    }

}

clip_image001

Bye see you next post

Nenhum comentário:

Postar um comentário