实际上这是针对代码覆盖的,我很难处理catch
语句。
有任何想法吗?
例如:
我希望我的selectSomethingBySomething()
方法(从db中选择)抛出SQLException
,这对于测试方法来说非常困难,而实际上并没有触及实际的源代码。还给出了我只能控制的约束是WHERE
子句的参数。
答案 0 :(得分:7)
您需要先模拟包含selectSomethingBySomething()
的类,然后记录此行为。在mockito中你会说:
SomeDao someDaoMock = mock(SomeDao.class);
willThrow(new SQLException())).given(someDaoMock).selectSomethingBySomething();
然后将someDaoMock
注入您正在测试的类中,当它调用someDaoMock.selectSomethingBySomething()
时,它将抛出先前选择的异常。
答案 1 :(得分:1)
你需要一个像Mockito这样的模拟框架。在这里查看易于阅读的refcard:
答案 2 :(得分:1)
使用EasyMock,您可以模拟一个Class以及该特定类的方法调用。
例如:
如果DoSomethingDAO是ClassName,
像DoSomethingDAO mockDAO那样模拟课程
EasyMock.createMock(DoSomethingDAO.class);
现在你必须模拟从这个mockDAO发出的所有调用。
如果方法返回一个值,我们需要模拟下面的调用。
EasyMock.expect(mockDAO.selectSomethingBySomething()).andReturn(EasyMock.anyObject());
如果方法抛出异常,则方法调用
EasyMock.expect(mockDAO.selectSomethingBySomething()).andThrow(new (typeofExecption));
for void methods
mockDAO.selectSomethingBySomething();
EasyMock.expectLastCall().atleastOnce();
答案 3 :(得分:0)
有很多方法可以做到这一点,但我的建议是不要以100%的代码覆盖率为目标。这根本不值得。你为自己的生活困难而获得微不足道的好处。
但是,如果您真的想测试它,可能最好的方法是更改代码以使其更易于测试。使您的数据访问类实现一个接口,然后使用模拟框架(如JMock)来模拟它并抛出一个SQLException。 (你可以模拟具体的类,但这不赞成。)
答案 4 :(得分:0)
实际上,您不需要其他框架即可完成技巧。 方法如下:
Exception hasToBeThrown = null;
try {
methodThatShouldThrow();
} catch (Exception e) {
assertTrue(e.getMessage().startsWith("if you want to...")); // JUnit will miss this, if not thrown, so we need more
hasToBeThrown = e;
}
assertNotNull(hasToBeThrown); // but this will do