quinta, 06 de novembro de 2008

Usando Mockito para facilitar seus testes

Escrito por: Alberto

Quando estava no workshop sobre DDD na Caelum, o Phillip falou que na Thoughtworks eles usavam o Mockito para criar os mocks dos objetos. Só uma esclarecida rápida, objetos mock são aqueles criados para simularem algum comportamento. O cenário preferido é aquele onde um objeto depende de outro para funcionar. Você tem um ServiceQQ onde o mesmo depende de um objeto que use algum webservice, como naquele momento você não tem isso implementado, então é criado um mock e passado para seu Service.

Baseado nisso, montei um exemplo para calcular as multas referentes a um carro. Existe o objeto do tipo Detran(orgão responsável pelo trânsito na Bahia) que usa um serviço para saber as multas de determinado carro e, caso existam multas, o valor total é associado ao mesmo. Como eu queria só testar a associação do valor total, não queria usar a implementação verdadeira da interface VerificadorDeMultas, então criei um mock. Abaixo segue o código.


package br.com.settech.exemplo;

import java.math.BigDecimal;
import java.util.Collection;

public class Detran {

private VerificadorDeMultas verificadorDeMultas;

public Detran(VerificadorDeMultas verificadorDeMultas){
this.verificadorDeMultas = verificadorDeMultas;
}

public Carro verificaMultasDoCarro(Carro carro){
Collection<Multa> multas = this.verificadorDeMultas.verificaMultas(carro);
if(multas.size()>0){
BigDecimal valorMultas = BigDecimal.ZERO;
for(Multa multa : multas){
valorMultas = valorMultas.add(multa.getValor());
}
carro.setValorDasMultas(valorMultas);
}
return carro;
}
}

package br.com.settech.exemplo;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

public class TestVerificadorMultas {

@Test
public void testVerificacaoDeMultas(){
Carro carro = new Carro("jpg-4060","Celta");
VerificadorDeMultas verificadorDeMultas = Mockito.mock(VerificadorDeMultas.class);
List<Multa> multas = new ArrayList<Multa>();
multas.add(new Multa(new BigDecimal(50),"Passou no vermelho"));
multas.add(new Multa(new BigDecimal(100),"Sem cinto"));

//adicionando comportamento
/*
* Quando chamarem o metodo verificaMultas, então é retornado minha colecao.
*/
Mockito.when(verificadorDeMultas.verificaMultas(carro)).thenReturn(multas);
Detran detran = new Detran(verificadorDeMultas);
Assert.assertEquals(new BigDecimal(150),detran.verificaMultasDoCarro(carro).getValorDasMultas());
}

@Test
public void testCarroSemMulta(){
Carro carro = new Carro("jpg-4060","Celta");
VerificadorDeMultas verificadorDeMultas = Mockito.mock(VerificadorDeMultas.class);
Detran detran = new Detran(verificadorDeMultas);
Assert.assertEquals(BigDecimal.ZERO,detran.verificaMultasDoCarro(carro).getValorDasMultas());
}
}

6 Comentários para " Usando Mockito para facilitar seus testes "

  • Denis Guedes Rangel

    07-11-2008 às 10:04:48

    Gostei do post…. mas o negócio e ruby!

  • Roger Leite

    07-11-2008 às 14:16:10

    Aê Alberto, seu blog foi pro meu Reader hein !!
    Continue com os ótimos posts !

  • Alberto

    07-11-2008 às 15:55:15

    @Denis

    Ruby é bem legal mesmo, mas deixa de radicalismo :), a gente consegue usar os dois… sempre dependendo da situação.

    @Roger

    Valeu velho, vou tentar sempre escrever coisas úteis.

  • André Faria Gomes

    08-11-2008 às 12:34:48

    Realmente o Mockito é bem legal.
    Acho bem menos verboso e que o JMock e mais simples de compreender.
    Parbéns pelo Blog!
    Abraço

  • Alberto

    08-11-2008 às 18:08:45

    Valeu André, também achei o Mockito bem mais simples que o JMock. Não gostei da forma que configuramos o fluxo nele, aquele lance das Expectations não ficou nada fluente para mim :)

  • Daniel S S Ribeiro

    09-11-2008 às 12:03:43

    Alberto, parabéns pelo blog. Ele tem tudo p ser um sucesso! É meu primeiro post e não poderia começar de outra forma se não com um elogio.

    Gostei do Mocktio! Ele eh relamente mais simples que o JMock e que o framework interno lah da empresa. No de lah, precisamos criar um xml com os dados dos ‘objetos’ que queremos construir o mock, o que da um trab extra. No entanto, um ponto positivo que vejo nesta abordagem é a possibilidade de reutilização dos cenários para testes futuros, caso ocorram alterações nos UCs.

    Abraço.


Deixe seu Comentários

  (obrigatório)

  (obrigatório) - (não é publicado)



newsletter

cadastre seu e-mail!  

últimas do twitter

» siga a settech no twitter

swTV

 


Atuando no mercado desde 1999, a SetWeb conta com um time de profissionais que busca soluções adequadas e eficazes para a sua empresa. Aliando estratégia à tecnologia, a SetWeb possui como foco principal o resultado de ações implementadas para cada negócio.
Esse é o nosso compromisso e o nosso desafio.