0
我想測試StreamDecorator
類:
如何在Java8上使用JUnit,PowerMock和/或EasyMock來模擬java.util.zip.GZIPInputStream?
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默認方法中存在一些問題。那個方向上的任何事情?
仍然沒有工作的你的最後一行模擬,得到同樣的例外。但是,我改變了斷言(編輯)。 – Learner
您是否也嘗試在最後一行中註釋驗證語句,然後執行測試。 – 2015-10-07 17:58:10
是的,我沒有刪除驗證語句 - 同樣的例外。 – Learner