quarta-feira, 25 de setembro de 2013

Mockito - Framework de teste para Java

Mockito

Framework que facilita o uso de mocks em testes unitários em Java

O que são teste unitário?

Teste de unidade é toda a aplicação de teste nas assinaturas de entradas e saídas de um sistema, consiste em validar dados válidos e inválidos via I/O (entrada/saída) sendo aplicado por desenvolvedores ou analistas de teste.
Uma unidade é a menor parte testável de um programa de computador. Em programação procedural, uma unidade pode ser uma função individual ou um procedimento. Idealmente, cada teste de unidade é independente dos demais, o que possibilita ao programador testar cada módulo isoladamente.
FONTE: Wikipédia
IDEIA: Testar a menor unidade testável.

Pirâmide de Testes - por Jason Huggins

O que são mocks?

Objetos pré-programados com informações que formam uma especificação das chamadas que esperam receber.


Exemplos práticos

Como criar um mock

List singleMock = mock(List.class);
List singleMock = mock(Foo.class);
@Mock private ArticleCalculator calculator;

Como simular um retorno

when(mockedList.get(0)).thenReturn("first");
when(mockedList.get(1)).thenThrow(new RuntimeException());
when(person.getAddress(anyString())).thenReturn("deep");
person.getAddress("the docks");

Como verificar se o método foi chamado

verify(mockedList).add("once");
verify(mockedList, never()).add("never happened");
verify(mockedList, atLeastOnce()).add("three times");
verify(mockedList, atLeast(2)).add("five times");
verify(mockedList, atMost(5)).add("three times");

Mock x Spy

Mock 

Todos os métodos são mocks, ao menos que se configure para ser chamado o método real.
Foo mock = mock(Foo.class);
when(mock.someMethod()).thenCallRealMethod();

Spy 

Todos os métodos são reais, ao menos que configure um retorno para o mesmo.
List spy = spy(List.class);
when(spy.size()).thenReturn(100);

Não existe bala de prata!



Frameworks não vão resolver todos os seus problemas. 

A necessidade de criar muitos mocks, de fazer chamar muitos "when" e "verify" para fazer um teste de unidade é um alerta para a arquitetura do seu código.