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
Você declara mClient
como uma simulação aqui:
@Mock
private HttpClient mClient;
Mas você também atribui a ele uma instância concreta de DefaultHttpClient
in setUp()
:
mClient = new DefaultHttpClient();
Apenas remova essa linha setup()
e a instância mClient
em 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.Mock
então suspeito que mClient
nã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 HttpClient
explicitamente getGoogle
aqui ...
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 @InjectMocks
para que você está instruindo o corredor de teste para injetar seu simulada em GoogleAccessor
mas 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.
deixe-me dizer algumas palavras