2012-07-19 52 views
3

其實這是代碼覆蓋率,我很難,涵蓋到catch報表。 任何想法?如何強制一個方法在jUnit測試中拋出異常?

例如:

我希望我的selectSomethingBySomething()方法(從數據庫中選擇)拋出SQLException這是相當困難的,而不實際接觸實際的源代碼的測試方法。還給出了我只能控制的條件是WHERE子句的參數。

+2

你應該讓你的數據庫連接對象的模擬,而不是實際發送SQL到數據庫。你正在測試你的代碼,而不是數據庫。如果你不知道嘲笑,快速谷歌搜索應該找到很多很好的介紹。 – Thor84no 2012-07-19 16:30:24

回答

6

您需要先嘲笑含selectSomethingBySomething()類,然後記錄這個行爲。在你會說:

SomeDao someDaoMock = mock(SomeDao.class); 

willThrow(new SQLException())).given(someDaoMock).selectSomethingBySomething(); 

然後注入someDaoMock到類下測試時,它調用someDaoMock.selectSomethingBySomething()它會扔之前選擇例外。

0

有很多方法,但我的建議是不瞄準100%的代碼覆蓋率。它根本不值得。你爲自己的生活帶來了微不足道的好處。然而,如果你真的想測試它,可能最好的方法是改變你的代碼,使其更具可測性。讓您的數據訪問類實現一個接口,然後使用一個模擬框架(如JMock)來模擬它並拋出一個SQLException。 (你可以嘲笑具體的課程,但這是皺眉。)

1

使用EasyMock你可以模擬一個類和該特定類的方法調用。

例如:

如果DoSomethingDAO是類名,

模擬類像DoSomethingDAO mockDAO

EasyMock.createMock(DoSomethingDAO.class); 

現在,你必須嘲笑正在從這個mockDAO所做的所有通話。

如果方法返回一個值,我們需要模擬下面的調用。

EasyMock.expect(mockDAO.selectSomethingBySomething()).andReturn(EasyMock.anyObject()); 

如果方法拋出下面的例外是在方法調用

EasyMock.expect(mockDAO.selectSomethingBySomething()).andThrow(new (typeofExecption)); 

爲void的方法

mockDAO.selectSomethingBySomething(); 
EasyMock.expectLastCall().atleastOnce();