1
resposta

Dificuldade para testar uma classe simples

Olá,

Onde eu trabalho não temos o costume de escrever testes unitários. Frequentemente, quando alguém sugere escrever um teste, respondemos "isso não dá pra testar".

Resolvi mudar isso e passar a escrever testes para as classes que eu desenvolver daqui pra frente. Mas a primeira classe que tive que fazer foi essa mostrada abaixo, que, sinceramente, não consegui escrever um teste unitário para ela.

Só para contextualizar, a classe serve para pedir ao usuário permissão para usar algum recurso do sistema em um aplicativo Android. Omiti imports e javadoc.

public final class PermissionChecker {

    public static void askPermission(int requestCode, Activity activity, String permission) {
        ActivityCompat.OnRequestPermissionsResultCallback callback = (ActivityCompat.OnRequestPermissionsResultCallback) activity;

        // If already has permission (second time called), invoke callback the same way Android system would do.
        if (ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED) {
            callback.onRequestPermissionsResult(requestCode, new String[]{permission}, new int[]{PackageManager.PERMISSION_GRANTED});
            return;
        }

        // If it's the first call, ask permission for Android system, which will invoke callback asynchronously.
        ActivityCompat.requestPermissions(activity, new String[]{permission}, requestCode);
    }

    public static boolean isGranted(int[] grantResults) {
        return (grantResults[0] == PackageManager.PERMISSION_GRANTED);
    }

}

Gostaria de testar principalmente o método askPermission. Ele só tem 5 linhas de código, mas tem chamadas a métodos estáticos e coisas acontecendo de modo assíncrono.

Como eu faço para testar isso?

1 resposta

Olá Alex, você está usando o Mockito/PowerMock?

Um roteiro de um teste de sucesso seria:

1- Criar um mock do activity.

2- Criar um mock para o método checkSelfPermission. Nas versões do mockito que utilizei, isso não era possível, pois segundo a documentação "isso era um problema de design da classe", mas como eu era o Tester e não o desenvolvedor, tive que utilizar o PowerMock para simular comportamento de método estáticos. Não sei se o mockito mudou hoje em dia :]

3- Se ele devolveu TRUE (assert comum), o teste hasPermissionComSucesso (por exemplo) passou com sucesso.

4- Se ele devolveu FALSE, e o método requestPermissions foi invocado, o teste askPermissionComSucesso (por exemplo) passou com sucesso.

Desse modo você estará testando o askPermission da Classe PermissionChecker , ou seja, você testou a responsabilidade dessa classe com sucesso.

Agora, se você quer testar se o método requestPermissions está fazendo a requisição corretamente, aí já é um outro teste de uma outra classe que não tem ligação nenhuma com esses testes.

Espero ter ajudado.