2016-09-20 289 views
0
阅读

我已经得到了我嘲弄,以避免在我的单元测试进行网络调用的方法,它看起来是这样的:JMockit - 模拟响应的InputStream正在JMockit

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

我已经用嘲笑它JMockit如下:

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

当我给它的NonStrictExpectation,其内部POS字段设置为0,因为它不是招”我希望以前在我的测试代码创建ByteArrayInputStream的没有写过。但是,当JMockit从模拟方法返回结果时,对象内部的字段被设置为流的大小,使得看起来该数组已经被读取,可能是由JMockit中的某些内容读取的。

这似乎是一个奇怪的行为,用于在测试代码中定义之间更改对象的内部可变状态,并通过JMockit返回到调用代码。 JMockit在将它提供给我的代码之前是否实际读取了这个InputStream?如果是这样,是否有办法关闭这种行为?

回答

0

我无法重现该问题(使用JMockit 1.27)。以下测试通过:

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); 
    } 
}