2016-09-20 1 views
0

ich eine Methode habe, dass ich spöttisch mache Netzwerk Anrufe während meiner Unit-Tests zu vermeiden, die etwa wie folgt aussieht:JMockit - Mock Antwort Input wird von JMockit lesen

InputStream sendRequestAndReturnResponseStream(String param1, Map<String, String> param2) 

Ich habe verspottete sie in JMockit mit dem folgenden:

final InputStream byteStream = new ByteArrayInputStream("MyTestString".getBytes(StandardCharsets.UTF_8)); 
new NonStrictExpectations() 
{ 
    { 
    mockHttpClient.sendRequestAndReturnResponseStream(anyString, null); 
    result = byteStream; 
    } 
}; 

Als ich den ByteArrayInputStream in meinem Test-Code zu erstellen, bevor ihm den NonStrictExpectation, sein interner po Feld auf 0 gesetzt zu geben, was ich erwarten würde, da es hasn t geschrieben worden. Wenn JMockit das Ergebnis von der Mocked-Methode zurückgibt, wird das Pos Feld innerhalb des Objekts auf die Größe des Streams festgelegt, so dass es scheint, dass das Array bereits gelesen wurde, vermutlich von etwas in JMockit.

Dies scheint ein seltsames Verhalten für den internen veränderbaren Zustand eines Objekts zu sein, das zwischen der Definition im Testcode und der Rückgabe an den aufrufenden Code durch JMockit geändert wird. Wird JMockit diesen InputStream tatsächlich lesen, bevor er es meinem Code gibt? Wenn ja, gibt es eine Möglichkeit, dieses Verhalten auszuschalten?

Antwort

0

Ich kann das Problem nicht reproduzieren (mit JMockit 1.27). Der folgende Test läuft:

public class ExampleTest 
{ 
    static class HttpClient { 
     InputStream sendRequestAndReturnResponseStream(
      String param1, Map<String, String> param2) { return null; } 
    } 

    @Test 
    public void returnUnchangedByteArrayInputStream(
     @Mocked final HttpClient mockHttpClient 
    ) throws Exception { 
     final InputStream byteStream = 
      new ByteArrayInputStream("MyTestString".getBytes(StandardCharsets.UTF_8)); 
     int originalCountMinusPos = byteStream.available(); // = 12 (count) - 0 (pos) = 12 

     new Expectations() {{ 
      mockHttpClient.sendRequestAndReturnResponseStream(anyString, null); 
      result = byteStream; 
     }}; 

     InputStream result = mockHttpClient.sendRequestAndReturnResponseStream("", null); 
     int currentCountMinusPos = result.available(); // different iif pos changed 

     assertSame(byteStream, result); 
     assertEquals(originalCountMinusPos, currentCountMinusPos); 
    } 
} 
Verwandte Themen