如何强制方法在jUnit测试中抛出异常?

时间:2012-07-19 16:26:18

标签: java java-ee testing junit

实际上这是针对代码覆盖的,我很难处理catch语句。 有任何想法吗?

例如:

我希望我的selectSomethingBySomething()方法(从db中选择)抛出SQLException,这对于测试方法来说非常困难,而实际上并没有触及实际的源代码。还给出了我只能控制的约束是WHERE子句的参数。

5 个答案:

答案 0 :(得分:7)

您需要先模拟包含selectSomethingBySomething()的类,然后记录此行为。在中你会说:

SomeDao someDaoMock = mock(SomeDao.class);

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

然后将someDaoMock注入您正在测试的类中,当它调用someDaoMock.selectSomethingBySomething()时,它将抛出先前选择的异常。

答案 1 :(得分:1)

你需要一个像Mockito这样的模拟框架。在这里查看易于阅读的refcard:

http://refcardz.dzone.com/refcardz/mockito

答案 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