Ich möchte mit Mockito folgenden Code testen:Kann nicht spotten java.io.Reader lesen
public static String funcToTest(String query) throws Exception {
String url = Config.getURL(serviceName);
HttpClient client = new HttpClient();
HttpMethod method = new GetMethod(url);
String resultantString= "";
method.setQueryString(URIUtil.encodeQuery(query));
client.executeMethod(method);
if (method.getStatusCode() == HttpStatus.SC_OK) {
Reader reader = new InputStreamReader(method
.getResponseBodyAsStream());
int charValue = 0;
StringBuffer sb = new StringBuffer(1024);
while ((charValue = reader.read()) != -1) {
sb.append((char) charValue);
}
resultantString = sb.toString();
}
method.releaseConnection();
return resultantString;
}
ich den Test erstellt wie folgt vor:
@Test
public void testFunc() throws Exception{
HttpMethod method = Mockito.mock(HttpMethod.class);
InputStream inputStream = Mockito.mock(InputStream.class);
Reader reader = Mockito.mock(Reader.class);
when(method.getResponseBodyAsStream()).thenReturn(inputStream);
PowerMockito.whenNew(Reader.class).withArguments(eq(inputStream)).thenReturn(reader);
Mockito.when(reader.read()).thenReturn((int)'1', -1);
String actualResult = cls.funcToTest("");
String expected = "1";
assertEquals(expected, actualResult);
}
Aber die reader.read()
Methode wird nicht zurückkehren 1. Stattdessen gibt es immer -1 zurück. Wie sollte ich Reader
so vortäuschen, dass read()
Methode etwas anderes als -1 zurückgibt.
Danke. spöttisch zu mock Funktion lokale Variablen/Referenzen
'System.out.println (inputStream.read());' druckt 1, aber 'resultReader.read()' Methode innerhalb while-Schleife gibt -1 jedes Mal zurück. Es ist also immer leer. – Emi
Bitte aktualisieren Sie Ihren Beitrag und geben Sie ganze getestete Klasse, es ist jetzt sehr vage. Aber Ihre Ausgabe ist -1, weil Sie Ihr Mock-Objekt nicht in der echten Methode übergeben, sondern einen anderen Eingabestream erstellen. Versuchen Sie PowerMockito.whenNew (InputStreamReader.class) .withArguments (eq (expectedArg1), eq (expectedArg2), ...). ThenReturn (expectedReader); es wird Ihnen helfen, injizieren Sie Ihre mock –
Ich habe bereits versucht 'PowerMockito.whenNew (InputStreamReader.class) .withArguments (inputStream) .thenReturn (Leser);', aber hier machen wir neue auf InputStreamReader-Klasse und erhalten Reader-Objekt. Es gibt also einen Fehler für nicht übereinstimmende Argumente. NB. Ich habe die Frage aktualisiert. – Emi