简体   繁体   中英

How to mock java.util.zip.GZIPInputStream using JUnit, PowerMock and/or EasyMock on Java8?

I want to test StreamDecorator class:

public interface IDecorator {
        default InputStream decorateStream() {
            if("gzip".equalsIgnoreCase(getEncoding())) {
                return new GZIPInputStream(getInputStream());
            }
            return is;
        }

        String getEncoding();

        InputStream getInputStream();
}

public class StreamDecorator implements IDecorator {
    private final InputStream is;
    private final String encoding;

    public StreamDecorator(InputStream is, String encoding) {
        this.is = is;
        this.encoding = encoding;
    }

    public String getEncoding() {
        return encoding;
    }

    public InputStream getInputStream() {
        return is;
    }
}

To test it, I have written the following test case:

@RunWith(PowerMockRunner.class)
public class TestStreamDecorator {
    @Test
    @PrepareForTest(value = { GZIPInputStream.class })
    public void testDecorateStream() throws Exception {
        InputStream mockInputStream = PowerMock.createMock(InputStream.class);
        EasyMock.expect(mockInputStream.read()).andReturn(-1);
        PowerMock.replay(mockInputStream);

        GZIPInputStream gzip = PowerMock.createMock(GZIPInputStream.class);
        PowerMock.expectNew(GZIPInputStream.class, mockInputStream).andReturn(gzip);
        PowerMock.expectNew(GZIPInputStream.class, mockInputStream, 512).andReturn(gzip);
        PowerMock.replay(gzip);
        PowerMock.replay(GZIPInputStream.class);

        StreamDecorator inStreamDecorator = new StreamDecorator(mockInputStream, "gzip");

        assertEquals(gzip, inStreamDecorator.decorateStream());

        PowerMock.verify(mockInputStream, gzip, GZIPInputStream.class);
    }
}

When I run the unit test, I get java.io.EOFException (see below). I know the reason for this exception -- it is because in second statement in TestStreamDecorator.testDecorateStream() method I'm returning -1 for InputStream.read().

But, my question is why is it even getting called when I have mocked the constructors (ie new instances)?

Also, I have tried mocking private readHeader() method of GZIPInputStream -- but getting different exception in another private method. So, I guess, I'm doing something wrong.

===================== Exception =====================

java.io.EOFException
    at java.util.zip.GZIPInputStream.readUByte(GZIPInputStream.java:268)
    at java.util.zip.GZIPInputStream.readUShort(GZIPInputStream.java:258)
    at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:164)
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:79)
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:91)
    ...

My guess is PowerMock has some issues with Java 8 default methods. Anything in that direction?

您实际上是在测试用例的最后一行中验证模拟,这就是为什么您要获得异常的原因删除测试的最后两行并添加它,然后测试用例通过

     assertEquals(mockInputStream, inStreamDecorator.decorateStream());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM