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



从 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);

相关内容

  • 没有找到相关文章

最新更新