4
respostas

Duvida com mockito

Venho estudando como fazer testes com rest porem estou quebrando a cabeça em um aplicativo de estudos que estou fazendo, eu tenho uma chamada para a API do github, porem nao consigo pegar o retorno dela no meu teste.

@Override
    public void searchBranchesInServer(String profileName, String repositoryName) {
        Call<ArrayList<BranchesTagsResponse>> responseCall = mRest.create(RestRepository.class).listBranches(profileName, repositoryName);
        responseCall.enqueue(new Callback<ArrayList<BranchesTagsResponse>>() {
            @Override
            public void onResponse(@NonNull Call<ArrayList<BranchesTagsResponse>> call, @NonNull Response<ArrayList<BranchesTagsResponse>> response) {// retorno sucesso }
            @Override
            public void onFailure(@NonNull Call<ArrayList<BranchesTagsResponse>> call, @NonNull Throwable t) {  // retorno erro }
        });
    }

e o meu teste esta assim

    @Test
    public void test1() throws InterruptedException {
        doAnswer(invocation -> {
            BranchPresenter callback = (BranchPresenter) invocation.getArguments()[0];
            callback.success(new ArrayList<>());
            return null;
        }).when(mModel).searchBranchesInServer(anyString(), anyString());   
        mRepository.searchBranchesInServer(anyString(), anyString());
}

quando eu executo esse teste eu consigo chamar o metodo searchBranchesInServer(), porem ele nao cai no onResponse ou onFailure ou no doAnswer..

Já quebrei a cabeça mas nada, alguem sabe o motivo?

Obrigado

4 respostas

Oi Thales, tudo bem?

Ao executar o teste, o doAnswerestá sendo chamado? Pois vendo bem por cima apenas com a amostra do seu código, a referência BranchPresenter não é um argumento da chamada de método do searchBranchesInServer() que recebe apenas duas Strings.

[]s

Opa Alex, tudo bem sim e voce? Obrigado pela resposta.

Entao o meu BranchPresenter é instanciado no construtor da classe que eu fiz no @Before, o meu metodo searchBranchesInServer() é chamado, mas o onResponse()/onFailure() nao.. estranho isso

se eu coloco um Thread.sleep(20000); no final do meu teste, o teste chama o onResponse()/onFailure() mas nao chama o doAnswer aparentemente

Oi Thales,

O que está acontecendo é o detalhe que mencionei anteriormente, o searchBranchesInServer() não tem como argumento uma referência do tipo BranchPresenter, portanto, nessa chamada do doAnswer() ele não consegue coletar o argumento esperado. Veja que no exemplo do curso, eu pego o terceiro argumento que é do mesmo tipo esperado da chamada do propoe():

    @Test
    public void deve_MostraMensagemDeFalha_QuandoFalharEnvioDeLanceParaAPI() {
        EnviadorDeLance enviador = new EnviadorDeLance(
                client,
                listener,
                manager);
        doAnswer(new Answer() {
            @Override
            public Object answer(InvocationOnMock invocation) {
                RespostaListener<Void> argument = invocation.getArgument(2);
                argument.falha("");
                return null;
            }
        }).when(client)
                .propoe(any(Lance.class),
                        anyLong(),
                        any(RespostaListener.class));

        enviador.envia(new Leilao("Computador"),
                new Lance(new Usuario("Alex"), 200));

        verify(manager).mostraToastFalhaNoEnvio();
        verify(listener, never()).processado(new Leilao("Computador"));
    }

Em outras palavras, para você acessar o BranchPresenter ele precisa ser um parâmetro do método searchBranchesInServer().

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software