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