Problemas ao tentar simular o cliente Apache HTTP com Mockito

AdityaReddy

Sou um novato aprimorando o Mockito. Eu tenho uma chamada HTTP get que gostaria de simular.

O arquivo do utilitário que deve ser testado é este.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class GoogleAccessor {
private HttpClient client ;

    public void getGoogle() throws ClientProtocolException, IOException {
        String url = "http://www.google.com/search?q=httpClient";
         client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);
        try {
            HttpResponse response = client.execute(request);
            BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuffer result = new StringBuffer();
            String line = "";
            while ((line = rd.readLine()) != null) {
                result.append(line);
            }
            System.out.println(result);
        } catch (Exception e) {
            System.out.println(e);
        }
    }

}

Este é o meu teste jUnit

import static org.mockito.Mockito.when;

import org.apache.http.ProtocolVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.message.BasicStatusLine;
import org.mockito.Mock;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;

public class TestTest {

    @Mock
    private HttpClient mClient;

    @InjectMocks
    private GoogleAccessor dummy;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testAddCustomer_returnsNewCustomer() throws Exception {
        when(mClient.execute(Mockito.any())).thenReturn(buildResponse(201, "OK", "{\"message\":\"Model was stored\"}"));
        dummy.getGoogle();
    }

    BasicHttpResponse buildResponse(int statusCode, String reason, String body) {
        BasicHttpResponse response = new BasicHttpResponse(
                new BasicStatusLine(new ProtocolVersion("HTTP", 1, 0), statusCode, reason));
        if (body != null) {
            response.setEntity(new ByteArrayEntity(body.getBytes()));
        }

        return response;
    }
}

Como mclient não foi iniciado, continuo recebendo este erro

java.lang.NullPointerException
    at com.amazon.cartographertests.accessors.TestTest.testAddCustomer_returnsNewCustomer(TestTest.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    ...

ATUALIZAÇÃO1: Eu incorporei comentários de @glytching e removi a inicialização da variável em setup () Eu incorporei comentários de @Maciej Kowalski e tornei o cliente uma variável de classe na classe Utilitário

ATUALIZAÇÃO 2:

O erro NPE foi resolvido após a resolução da importação correta -> import org.mockito.Mock;

Mas, o problema de não ver a resposta simulada ainda existe

glytching

Você declara mClientcomo uma simulação aqui:

@Mock
private HttpClient mClient;

Mas você também atribui a ele uma instância concreta de DefaultHttpClientin setUp():

mClient = new DefaultHttpClient();

Apenas remova essa linha setup()e a instância mClientem uso em seu teste será uma simulação.

Atualização : sua pergunta atualizada mostra esta importação:

import org.easymock.Mock;

Isso deveria ser

import org.mockito.Mock;

Esta instrução: MockitoAnnotations.initMocks(this);inicializará qualquer membro da classe anotado com org.mockito.Mock, não fará nada a um membro da classe anotado com, org.easymock.Mockentão suspeito que mClientnão esteja sendo inicializado e, portanto, o NPE. Quando executo seu código localmente, com a importação correta, o teste é concluído com êxito, sem exceções.

Observação: também há um problema interno GoogleAccessor, você instancia o HttpClientexplicitamente getGoogleaqui ...

HttpClient client = new DefaultHttpClient();

... portanto, este método nunca usará o simulado HttpClient.

Se você comentar esta linha:

HttpClient client = new DefaultHttpClient();

... e adicionar este membro da classe a GoogleAccessor:

private HttpClient client;

... então você descobrirá que seu cliente simulado será usado dentro getGoogle().

Para plano de fundo; para usar uma instância simulada dentro de uma classe, você deve fornecer alguma maneira para o executor de teste injetar essa instância simulada na classe. Em seu caso de teste que você está usando @InjectMockspara que você está instruindo o corredor de teste para injetar seu simulada em GoogleAccessormas já que não há membro da classe desse tipo o corredor de teste não tem nada a atribuir o mock para . Além disso, mesmo que pudesse atribuir o mock a algo, você estava declarando o cliente http dentro getGoogle() , forçando, assim, todas as invocações desse método a usar uma instância concreta de DefaultHttpClient.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Problemas ao tentar inicializar o Chef para o cliente Windows com o Knife-windows

Valor nulo ao tentar simular um valor de byte [] com junit5 e mockito

NPE ao tentar usar o cliente HTTP assíncrono Jetty

KeyError: 'Ação' ao tentar simular o DynamoDB

Tentar novamente as solicitações com o cliente Netty HTTP

Erro ao tentar simular o NavController

Problemas com o Emacs Tramp ao tentar acessar o arquivo remoto com sudo

Como simular serviço com Mockito?

Problemas ao tentar instalar o spacy

Problemas ao tentar criar o layout correto

Problemas ao tentar importar o componente no React

Problemas ao tentar alcançar o controlador com uma visão parcial

Tiver problemas com o loop while e tentar encerrar o programa ao pressionar uma letra

Problemas com meu cliente Apache CXF

O cliente travou ao tentar ler com io.CopyN () no golang

Problemas ao testar com @Capture Mockito

Problemas ao tentar selecionar linhas com base em uma restrição?

Problemas ao tentar ler um arquivo de dados criado com o módulo de array Python

Problemas de verificação SSL ao tentar clonar repo git com cocoapods

Problemas ao tentar retornar a visualização com um controlador de API

Problemas com o objeto Date ao tentar usar os métodos getYear () e getDay ()

Ao tentar instalar o php-jwt enfrentando problemas com auth0

Tendo problemas ao tentar redirecionar o usuário com base no estado, usando React-Router

Tendo problemas ao tentar injeção de dependência com tsyringe e typeorm

Problemas ao tentar classificar uma lista com um padrão específico

Problemas ao tentar instalar sylius / product-bundle em meu projeto Symfony 5.3 com o composer

Threads travados com o cliente Apache HTTP 4.5.x

Threads travados com o cliente Apache HTTP 4.5.x

Mockito: simulação de uma chamada HTTP com o cliente HTTP OK