2012-07-19 54 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();