2014-05-12 29 views
0

我想使用EasyMock來測試一個方法運行特定次數,但我不斷收到一個IllegalStateException錯誤,我不明白爲什麼。我是EasyMock和JUnit的新手,對於如何使用它們不是很熟悉,所以我不確定自己做錯了什麼。IllegalStateException - 沒有最後一個模擬調用

我的代碼是:

FileOutputStream mockWriter; 
Numbers mockByte; 
@Test 
public void testNumbers() throws IOException{ 
    mockWriter = createMock(FileOutputStream.class); 
    mockByte = new Numbers(mockWriter); 
    mockByte.initByte(); 
    expect(mockByte.generate()).times(10000); 
    replay(mockWriter); 
} 

而這些方法initByte和我的號碼類生成:

public void initByte() throws IOException{ 
    File outFile = new File("NumbersOutput.txt"); 
    FileOutputStream f = new FileOutputStream(outFile); 
    for(int i = 0; i < 10000; i++){ 
     int b = generate(); 
     f.write(b); 
    } 
    f.flush(); 
    f.close(); 
} 

public int generate(){ 
    return rand.nextInt(100001); 
} 

回答

4

你得到的錯誤是因爲什麼也沒有調用您的模擬什麼。

與您的命名相反,mockByte根本不涉及模擬,因此在這樣的expect調用中使用它不會對您有所幫助。如果有任何問題,您應該期待mockWriter的電話。

但是,目前尚不清楚爲什麼你要使用一個模擬流,也不知道Numbers構造函數中的OutputStream是用來做什麼的。你的initByte()方法不使用rand以外的任何狀態。即使這個問題得到解決,使用ByteArrayOutputStream也可能是最簡單的方法...使用API​​來使用OutputStream而不是FileOutputStream,並且測試起來會更容易。

我懷疑你應該:

  • initByte方法刪除的新FileOutputStream建設,而不是給你寫信的Numbers構造
  • 如果你的構造函數參數類型FileOutputStream,改變接受流它到OutputStream,使其更清潔,更容易測試
  • 在您的測試中創建一個ByteArrayOutputStream - 你根本不需要嘲笑。然後你可以獲得所有已寫入的字節,並檢查它們是否有你想要的。
  • 仔細想想你期望f.write(b)要做什麼。它只會寫一個字節,所以你的隨機數的前24位將被忽略。那麼,爲什麼你選擇的範圍是[0,10000]呢?
相關問題