其实这是代码覆盖率,我很难,涵盖到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