2012-04-18 63 views
0

我在編程應用程序,我需要模擬文件來測試它。我下面的代碼:EasyMock和Java中的文件

@Test 
public void testPostMail() throws Exception 
{ 
    Emailer instance = new Emailer(); 
    instance.setRecipientsFromFile(new File("list.txt")); 
} 

的問題是,我不希望依賴於文件在我的硬盤驅動器(當然我可以將文件與適當的內容和測試後刪除它,但我想用EasyMock來完成)。

我試圖導入org.easymock.classextension.EasyMock和使用它,但:

1)我仍然得到錯誤 「文件不是一個接口」

2)classextension.EasyMock已過時,所以我應該只使用了EasyMock

我不工作了EasyMock代碼:

@Test 
public void testSetReceipientsFromFile() throws Exception 
{ 
File file = EasyMock.createMock(File.class); 
FileReader in = EasyMock.createMock(FileReader.class); 
BufferedReader br = EasyMock.createMock(BufferedReader.class); 

EasyMock.expect(new FileReader(file)).andReturn(in); 
EasyMock.expect(new BufferedReader(in)).andReturn(br); 

EasyMock.expect(br.readLine()).andReturn("[email protected]"); 
EasyMock.expect(br.readLine()).andReturn("[email protected]"); 

EasyMock.replay(file, in, br); 

EasyMock.verify(file, in, br); 

// ... 
} 

編輯:我想知道從EasyMock的改變的Mockito,因爲我聽到更多有利的意見。

+2

如果你不依賴於EasyMock的,開始使用的Mockito。它可以嘲笑具體的課程。 – 2012-04-18 16:07:35

+0

你爲什麼試圖測試廣泛使用的API?這當然很好。你應該測試你的代碼。的 – 2012-04-18 16:47:54

+0

可能重複的[使用懲戒具體類EasyMock的](http://stackoverflow.com/questions/1249317/mocking-a-concrete-class-using-easymock) – 2014-04-02 09:09:45

回答

1

EasyMock和Mockito都不支持模擬對象的構造。因此,您需要一個支持它的庫,如PowerMock或PowerMockito。

但是,我認爲這裏有一個設計缺陷。 Emailer是否有責任讀取文件?我不這麼認爲。

我會提取代碼從Emailer讀取文件到新的類負責從文件讀取收件人列表。這將使Emailer更可測試。如果你想測試這個新類,那麼創建一個真實文件(使用TemporaryFolder rule)將是一個自然的選擇,因爲閱讀文件是該類的主要職責。

1

在你的Mockito做這樣的:

BufferedReader br = Mockito.mock(BufferedReader.class); 

    Mockito.when(br.readLine()) 
      .thenReturn("[email protected]") 
      .thenReturn("[email protected]"); 

    // Alternative 
    // Mockito.when(br.readLine()).thenReturn("aaa", "bbb"); 

    Assert.assertEquals("[email protected]", br.readLine()); 
    Assert.assertEquals("[email protected]", br.readLine()); 
0

「聽你的測試」。你應該創建一個圍繞File的包裝並在Emailer中使用它。

0

由於EasyMock的3.0(目前的版本是3.2),你可以嘲笑具體類,所以你現在就不會出現此錯誤。