从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()"打电话,但这似乎是hacky。如果我能说这个步骤N次,然后做下一件事就好了。
答案 0 :(得分:2)
如果你需要调用thenThrow()
两次,我认为这种重复不是一个严重的问题:
.when(mock.someMethod("some arg"))
.thenThrow(new RuntimeException())
.thenThrow(new RuntimeException())
.thenReturn("foo");
现在,如果您需要调用thenThrow()
两次以上,创建一个实用程序类来丰富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");
答案 1 :(得分:1)
thenTrow方法可以采用var-args。这意味着您可以执行以下操作:
when(mock.someMethod("some arg"))
.thenThrow(new RuntimeException(), new RuntimeException())
.thenReturn("foo");
因此您不需要复制thenThrow()方法调用。但是可以肯定的是,如果你想抛出类似10次的异常,这个解决方案可能不会很好......
也许如果Ineed与Mockito一起抛出10次异常,我会写一些类似的东西:
Exception[] exceptions = new Exception[10];
for (int i = 0; i < exceptions.length ; i++) {
exceptions[i] = new RuntimeException();
}
when(mock.someMethod()).thenThrow(exceptions);