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

2022-09-03 14:12:45

我正在使用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 语句中。


答案 1

最简单的方法是:

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

但是单元测试中的单个方法应该验证对代码行为的单一期望。因此,更好的方法是编写两个单独的测试方法。


答案 2

与具有某些状态的自定义答案一起使用,例如:thenAnswer()

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/(注意:不是我的博客)


推荐