2015-10-27 74 views
2

我想模擬InputStream(與InputStreams一樣)阻塞的單元測試中的行爲,直到有更多數據可用。這需要我以塊的形式向InputStream附加字節,以便消費者也能以塊的形式讀取它們。事情是這樣的:將字節添加到InputStream

@Test 
public void readAllInput() throws Exception { 
    ???InputStream in = ...; // ??? 
    Consumer consumer = new Consumer(in); 
    Thread consumingThread = new Thread(consumer).start(); 

    in.add("one".getBytes("UTF-8")); // ??? 
    in.add("two".getBytes("UTF-8")); // ??? 
    in.close(); 
    consumingThread.join(); 

    assertThat(consumer.getDataAsString()).isEqualTo("onetwo"); 
} 

class Consumer implements Runnable { 
    private InputStream in; 
    private ByteArrayOutputStream out = new ByteArrayOutputStream(); 

    public Consumer(InputStream in) { 
     this.in = in; 
    } 

    public void run() { 
     IOUtils.copy(in, out); 
    } 

    public String getDataAsString() { 
     return out.toString("UTF-8"); 
    } 
} 

什麼樣的InputStream(或任何其他解決方案),讓我將數據追加一端,並從其他消耗他們的?

注意:消費者需要有基於InputStream的API(而不是Reader)。

回答

3

正如你使用的線程,這是一對罕見的情況下一對PipedInputStream/PipedOutputStream.