2015-10-06 94 views
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默认方法中存在一些问题。那个方向上的任何事情?

回答

0

你实际上是验证测试的情况下这就是为什么你所得到的例外 删除您测试的最后两行,并增加这一点,你测试的情况下通过

 assertEquals(mockInputStream, inStreamDecorator.decorateStream()); 
+0

仍然没有工作的你的最后一行模拟,得到同样的例外。但是,我改变了断言(编辑)。 – Learner

+0

您是否也尝试在最后一行中注释验证语句,然后执行测试。 – 2015-10-07 17:58:10

+0

是的,我没有删除验证语句 - 同样的例外。 – Learner

相关问题