其實這是代碼覆蓋率,我很難,涵蓋到catch
報表。 任何想法?如何強制一個方法在jUnit測試中拋出異常?
例如:
我希望我的selectSomethingBySomething()
方法(從數據庫中選擇)拋出SQLException
這是相當困難的,而不實際接觸實際的源代碼的測試方法。還給出了我只能控制的條件是WHERE
子句的參數。
其實這是代碼覆蓋率,我很難,涵蓋到catch
報表。 任何想法?如何強制一個方法在jUnit測試中拋出異常?
例如:
我希望我的selectSomethingBySomething()
方法(從數據庫中選擇)拋出SQLException
這是相當困難的,而不實際接觸實際的源代碼的測試方法。還給出了我只能控制的條件是WHERE
子句的參數。
您需要先嘲笑含selectSomethingBySomething()
類,然後記錄這個行爲。在mockito你會說:
SomeDao someDaoMock = mock(SomeDao.class);
willThrow(new SQLException())).given(someDaoMock).selectSomethingBySomething();
然後注入someDaoMock
到類下測試時,它調用someDaoMock.selectSomethingBySomething()
它會扔之前選擇例外。
你需要一個像Mockito一樣的模擬框架。這裏退房易於閱讀的Refcard:
有很多方法,但我的建議是不瞄準100%的代碼覆蓋率。它根本不值得。你爲自己的生活帶來了微不足道的好處。然而,如果你真的想測試它,可能最好的方法是改變你的代碼,使其更具可測性。讓您的數據訪問類實現一個接口,然後使用一個模擬框架(如JMock)來模擬它並拋出一個SQLException。 (你可以嘲笑具體的課程,但這是皺眉。)
使用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();
你應該讓你的數據庫連接對象的模擬,而不是實際發送SQL到數據庫。你正在測試你的代碼,而不是數據庫。如果你不知道嘲笑,快速谷歌搜索應該找到很多很好的介紹。 – Thor84no 2012-07-19 16:30:24