2015-10-06 50 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

相關問題