让Mockito 1.x在前N个调用中抛出异常,然后返回一个值?

时间:2018-06-01 19:51:34

标签: java mockito

从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次,然后做下一件事就好了。

2 个答案:

答案 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);