Java Mock抛出一个异常,然后返回一个值?

时间:2017-08-09 17:25:07

标签: java unit-testing mockito

我正在使用JUnit 4和Mockito 2.我试图模拟一个情况,模拟函数在第一次调用时返回异常,并在随后的调用中返回一个有效值。我试过简单地使用thenThrow()后跟thenReturn(),但这显然不是正确的方法

when(stmt.executeUpdate()).thenThrow(new SQLException("I have failed."));
when(stmt.executeUpdate()).thenReturn(1);
sut.updateValue("1");
verify(dbc).rollback();
sut.updateValue("2");
verify(dbc).commit();

然而,这两个调用都会导致调用rollback(),这是在catch语句中。

3 个答案:

答案 0 :(得分:5)

thenAnswer()与自定义Answer一起使用,状态如下:

class CustomAnswer extends Answer<Integer> {

    private boolean first = true;

    @Override
    public Integer answer(InvocationOnMock invocation) {
        if (first) {
            first = false;
            throw new SQLException("I have failed.");
        }
        return 1;
    }
}

一些阅读:https://akcasoy.wordpress.com/2015/04/09/the-power-of-thenanswer/(注意:不是我的博客)

答案 1 :(得分:1)

您可以进行两项单独的测试。 要验证异常,您可以执行以下操作:

@Test(expected = SQLException.class)
public void yourTest()throws Exception{
stmt.executeUpdate(); //set your logic to produce the exception
}

然后对成功案例进行另一次测试

答案 2 :(得分:0)

最简单的方法是:

when(stmt.executeUpdate())
     .thenThrow(new SQLException("I have failed."))
     .thenReturn(1);

但是单元测试中的单个方法应该验证关于代码行为的单个期望。因此,更好的方法是编写两种不同的测试方法。