Usando Mockito em testes unitários de aplicativos Android

shutterstock_835306361O que fazer quando queremos testar uma parte especifica do código, mas que possui alguma dependência com outra parte e que não necessariamente queremos testar naquele momento? Simples, utilizamos mocks. E se quero fazer isso para um aplicativo Android? Simples, utilizamos Mockito. Mocks são objetos que podemos criar de forma controlada, ou seja, não precisamos nos preocupar com sua implementação. São objetos que imitam os objetos reais do nosso sistema. Para aqueles que não conhecem afundo o conceito de mock, é interessante ler primeiro quais são as vantagens e como utilizar mocks.

Neste post será mostrado o que é necessário configurar para que seja possível criar testes unitários usando mock em um projeto Android. Existem vários frameworks que possibilitam criar mocks para aplicativos Android e para outros tipos de sistema, entre eles os mais conhecidos no mercado são: Mockito, EasyMock e jMock.

A seguir será mostrado um exemplo bem simples de como utilizar o framework Mockito para criar mocks em testes unitários em uma aplicação Android.

A aplicação consiste em simular um débito em uma conta. Basicamente o aplicativo verifica se existe ou não o saldo e exibe uma mensagem informando se o débito foi realizado. Nesse link é possível fazer o download do código do aplicativo.

O primeiro passo é criar um projeto apenas para especifico para rodar os testes unitários. Abaixo é exibido como ficou a estrutura do projeto de testes da aplicação de exemplo.

projeto

Figura 1 – Estrutura projeto de testes unitários

Neste momento devemos realizar as configurações necessárias para que seja possível utilizar o framework Mockito.  Insira no classpath as seguintes bibliotecas:

  • mockito-all-1.9.1-SNAPSHOT.jar
  • dexmaker-mockito-1.0.jar
  • dexmaker-1.0.jar

Pode ser feito o download da versão atual das bibliotecas dexmaker aqui.

O próximo passo é configurar no AndroidManifest.xml, indicando que o projeto será utilizado para a execução de testes. Abaixo segue o AndroidManifest.xml configurado para o nosso projeto de exemplo.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.exemplo.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.exemplo" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner" />
    </application>

</manifest>

Listagem 1 – AndroidManifest.xml configurado para executar testes unitários

Pronto! Todas as configurações necessárias para utilizar o Mockito foram feitas. Agora é possível utilizar os métodos do framework e criar mocks que ajudarão no momento de criar os testes. Abaixo segue como ficou a classe de testes criada para o aplicativo de débito utilizando os métodos do Mockito.

package com.exemplo.test;

import android.test.InstrumentationTestCase;
import com.example.*;

import static org.mockito.Mockito.*;

public class ContaTest extends InstrumentationTestCase {
  
    public void testContaComLimite() {
        Conta conta = mock(Conta.class);
        
        when(conta.possuiSaldo("Corrente", 50)).thenReturn(true);
        
        SolicitacaoDeRetirada solicitacao = new SolicitacaoDeRetirada("Corrente", 50);
        solicitacao.debitar(conta);
        
        assertTrue(solicitacao.continuaComSaldo());
        verify(conta).debitar("Corrente", 50);
    }
    
    public void testContaSemLimite() {
        Conta conta = mock(Conta.class);
        
        when(conta.possuiSaldo("Corrente", 50)).thenReturn(false);

        SolicitacaoDeRetirada solicitacao = new SolicitacaoDeRetirada("Corrente", 50);
        solicitacao.debitar(conta);
        
        assertFalse(solicitacao.continuaComSaldo());
    }
}
Listagem 2 – Código de Testes Unitários utilizando métodos do framework Mockito para criar mocks

Foram criados dois testes unitários, um validando o comportamento quando a conta possui o saldo e outra quando a conta está sem limite. Neste caso é necessário por exemplo saber qual é o saldo real da conta configurada? A resposta é não. Usamos um mock para simular a classe que retorna o saldo da conta e fazemos com que a classe retorne o que esperamos.

Conta conta = mock(Conta.class);
Listagem 3 – Exemplo de mock da classe Conta

No treco de código listado acima é possível ver que foi criado um mock da classe conta.

Basicamente o que o primeiro teste faz é criar o mock de uma conta simulando que ela tenha 50 reais de saldo e realizar um débito no mesmo valor. O teste verifica se o sistema debita quando o valor é menor ou igual ao saldo. Já no segundo caso é o oposto. É criado o mock da conta com saldo de 50 reais, porém utilizando o método thenReturn(false) do Mockito, é simulado que a conta não possui o saldo suficiente para o débito de 50, portanto o aplicativo não deve permitir o débito.

teste_resultado

Figura 2 – Tela do aplicativo usado como exemplo e resultado dos testes unitários

Esse foi um exemplo bem simples de como utilizar o framework Mockito. Uma vez sabendo quais bibliotecas adicionar e o que é necessário configurar, basta conhecer quais são os métodos disponíveis pelo framework e criar testes unitários para seus aplicativos Android.

Abaixo segue uma lista de outros posts que podem ser interessantes de serem lidos pois os temas de modo geral são relacionados:

Links externos

http://mockito.org/

Mockito on Android step-by-step

http://blogs.impetus.com/mobility/android/MockitoOnAndroid.do

Por MONISE COSTA

Formada em Sistemas de Informação pela PUC Campinas, MATERANA desde 2011. Apaixonada pela área de TI, Analista de Requisitos na maior parte do tempo e desenvolvedora Java/Android por lazer.

Postado em: 10 de março de 2015

Confira outros artigos do nosso blog

REST não é JSON

21 de agosto de 2017

Bruno Sofiato

[Webinar] Profile de aplicações Java com Oracle Mission Control e Flight Recorder

24 de julho de 2017

Danival Calegari

Criando Mocks de serviços REST com SoapUI

27 de junho de 2017

Monise Costa

JavaScript 6: diferença entre var, let e const

09 de maio de 2017

Otávio Felipe do Prado

Deixe seu comentário