簡體   English   中英

如何在Java8上使用JUnit,PowerMock和/或EasyMock模擬java.util.zip.GZIPInputStream?

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

我想測試StreamDecorator類:

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

為了測試它,我編寫了以下測試用例:

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

當我運行單元測試時,我得到了java.io.EOFException(見下文)。 我知道發生此異常的原因-這是因為在TestStreamDecorator.testDecorateStream()方法的第二條語句中,我為InputStream.read()返回-1。

但是,我的問題是,當我嘲笑構造函數(即新實例)時,為什么它甚至被調用?

另外,我嘗試過模擬GZIPInputStream的私有readHeader()方法-但在另一個私有方法中得到了不同的異常。 所以,我想我做錯了。

=====================例外=====================

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)
    ...

我的猜測是PowerMock在Java 8默認方法方面存在一些問題。 那個方向有什么嗎?

您實際上是在測試用例的最后一行中驗證模擬,這就是為什么您要獲得異常的原因刪除測試的最后兩行並添加它,然后測試用例通過

     assertEquals(mockInputStream, inStreamDecorator.decorateStream());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM