A #Protip de hoje é de #androidtesting do +Stephan Linzner, sobre teste unitário usando Mockito.



Escrever testes unitários é uma parte importante do ciclo de desenvolvimento de um app Android, já que isso encoraja uma abordagem de desenvolvimento incremental, e permite que o código seja facilmente refatorado para uma melhoria continua. Os testes unitários tem muita relação com dependências ou sobre substituir dependências por testes dublês(test doubles)[0]. Isso permite que você rode seus testes o mais isolados possível. Mas isso levanta a questão de como você pode criar de maneira eficaz, testes dublês no seus testes unitários. Uma maneira de se criar testes dublês no Android é usando o Mockito [1]. Mockito é um framework open source que oferece uma API fluente e legível, que permite tanto testes baseado em estado (state-based-testing, stubbing) assim como testes de comportamento (behavioral-testing, verifications) [2].

Para começar com o Mockito no seus testes unitários, você precisa incluir a seguinte dependência no seu arquivo build.gradle [3]:

dependencies {
    androidTestCompile 'org.mockito:mockito-core:1.9.5’
    androidTestCompile 'com.google.dexmaker:dexmaker:1.0’
    androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0’
_}

Para criar um objeto mock nos seus testes unitários, você pode usar os métodos estáticos do Mockito ou anotações.

AccountManager mMockAccountManager = mock(AccountManager.class);

Isso irá criar um objeto mock para a classe AccountManager do Android. Uma abordagem um pouco mais limpa, é usar a anotação @Mock que irá melhorar muito a legibilidade do seu código de teste.


@Mock
private AccountSelectionUi mAccountSelectionUi;


Para simular métodos com mockito, siga o padrão when/then. Para simular um método, chame:

when(mMockAccountManager.getAccounts()).thenReturn(TWO_ACCOUNTS);

Aqui, o AccountManager.getAccounts() irá retornar uma conta falsa quando chamado pelo AccountsController. Isso permite a você simular facilmente as dependências, o que pode ser bem útil quando está lidando com frameworks. Mas o Mockito também permite verificar interações.

verify(mAccountSelectionUi).showAccounts(aryEq(TWO_ACCOUNTS));

Nesse caso, podemos verificar se o método showAccounts() foi chamado na classe AccountSelectionUi, com o array de objetos do tipo Account como esperado. Você pode achar o código exemplo para o AccountsControllerTest nesse gist http://goo.gl/IOjbXU.

Mockito pode ser uma ferramenta muito útil quando se vai criar testes dublês, mas fique atento as suas limitações. Mockito não pode criar mocks para classes e métodos finais. A filosofia de teste do Mockito é que os testes devem ser fáceis de entender e com baixa manutenção, portanto use mocks para simular métodos dos quais os testes unitários dependam e asserts nos estados para a sua unidade, ao invés de verificação de comportamento, que irá resultar em um teste frágil. Tem outras dicas de Mockito? Compartilhe nos comentários. Bons testes!

[0] http://www.martinfowler.com/bliki/TestDouble.html 
[1] https://code.google.com/p/mockito
[2] http://martinfowler.com/articles/mocksArentStubs.html
[3] Para usar o Mockito no Eclipse, você precisa copiar as dependências para a pastar /libs do seu projeto Android de testes.

Comentários

Postagens mais visitadas deste blog

Rails CanCan

Meus insights mais valiosos sobre criptomoedas para 2018 e além

Como pegar a senha do Whatsapp de um Android ou Iphone