[英]How to improve java.util.zip.GZIPInputStream performance to unzip a large .gz file?
[英]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.