从 Mockito 1.x 文档中,我看到了这个例子,这几乎正是我所需要的:
when(mock.someMethod("some arg"))
.thenThrow(new RuntimeException())
.thenReturn("foo");
我真正需要的是这样的东西:
when(mock.someMethod("some arg"))
.thenThrow(new RuntimeException(), times(2))
.thenReturn("foo");
我可以简单地复制"thenThrow(("调用,但这似乎很笨拙。 如果我能说做这一步N次,然后做下一件事,那就太好了。
如果您需要调用thenThrow()
2 次,我认为这种重复不是一个严重的问题:
.when(mock.someMethod("some arg"))
.thenThrow(new RuntimeException())
.thenThrow(new RuntimeException())
.thenReturn("foo");
现在,如果您需要调用thenThrow()
2 次以上,创建一个实用程序类来丰富 Mockito 功能可能是最好的选择。您也可以向 mockito 团队提交添加此功能的请求。
例如,您可以创建一个创建Throwable
数组的方法:
private static Throwable[] chainedThrow(Supplier<Throwable> supplier, int times) {
return IntStream.rangeClosed(1, times)
.mapToObj(i -> supplier.get())
.toArray(Throwable[]::new);
}
并以这种方式调用它,例如抛出 2 次异常:
Mockito.when(mock.someMethod("some arg"))
.thenThrow(chainedThrow(RuntimeException::new, 2))
.thenReturn("foo");
那么Trow方法可以采用var-args。这意味着您可以执行以下操作:
when(mock.someMethod("some arg"))
.thenThrow(new RuntimeException(), new RuntimeException())
.thenReturn("foo");
所以你不需要复制 thenThrow(( 方法调用。但是可以肯定的是,如果您想抛出类似 10 次的异常,此解决方案可能不是很好......
也许如果我需要使用 Mockito 抛出异常 10 次,我会写这样的东西:
Exception[] exceptions = new Exception[10];
for (int i = 0; i < exceptions.length ; i++) {
exceptions[i] = new RuntimeException();
}
when(mock.someMethod()).thenThrow(exceptions);