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.