JMockit - 模拟响应InputStream正由JMockit读取

时间:2016-09-20 22:03:18

标签: java 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之前在我的测试代码中创建ByteArrayInputStream时,它的内部 pos 字段被设置为0,这是我所期望的,因为它还没有写入。但是,当JMockit从模拟方法返回结果时,对象内的 pos 字段被设置为流的大小,使得看起来数组已经被读取,可能是JMockit中的某些内容

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

1 个答案:

答案 0 :(得分:1)

我无法重现问题(使用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);
    }
}