我正在使用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语句中。
答案 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);
但是单元测试中的单个方法应该验证关于代码行为的单个期望。因此,更好的方法是编写两种不同的测试方法。