如何在Mockito中多次模拟抛出异常

3

我希望能够通过桩方法调用40次,先抛出异常,然后再返回真实对象。据我所知,Mockito 1.10.8的thenThrow()方法接受n个Throwable参数:

OngoingStubbing<T> thenThrow(Throwable... throwables);

因此,我认为我可以采取以下措施。
@RunWith(MockitoJUnitRunner.class)
public class MyObjectTest
{
    @Mock(answer = Answers.RETURNS_MOCKS)
    private Mama mama;

    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private Papa papa;

    private MyObject _instance;

    @Test
    public void test()
    {
        _instance = new MyObject(papa, mama);

        Throwable[] exceptions = new Throwable[41];

        Arrays.fill(exceptions, 0, 40, new ConnectionException("exception message"));

        when(papa.getMapper().map(anyString())).thenThrow(exceptions).thenReturn(new MyMap());

        verify(papa, times(41)).getMapper().map(anyString());
    }
}

然而,当我运行此测试时,会出现以下情况。

org.mockito.exceptions.base.MockitoException: 无法使用空异常进行存根! at MyObjectTest.test(MyObjectTest.java:105)

MyObjectTest.java:105是存根化发生的行。

为什么会出现这个错误?


如果你使用thenThrow(new ConnectionException("exception message"))进行替换,它是否仍会抛出MockitoException? - jlewkovich
不,它并没有。实际上,同一测试类中的另一个测试执行了该操作,并且通过了测试。 - bluesman80
1
我无法理解您需要什么。您能否写得更详细一些,让我了解您的期望? - Fariba
1
@Fariba 我想测试papa.getMapper().map()方法是否被调用了41次。因为我的测试类在抛出ConnectionException异常时会调用这个方法,但最多只能调用40次。 - bluesman80
@bluesman80 我建议你检查一下使用 Arrays.fill() 填充 exceptions 对象的过程是否正确,确保数组内部的值不是 null。 - jlewkovich
显示剩余2条评论
1个回答

4
您之所以会出现此异常,是因为您有一个包含41个元素的Throwable[],但您只使用实际的ConnectionException值填充了其中的40个元素。最后一个元素是nullthenThrow不接受抛出null这将导致抛出NullPointerException)。
您的数组应该只包含40个元素。
Throwable[] exceptions = new Throwable[40];

我简直不敢相信我为此苦苦挣扎了几个小时!结果是一个愚蠢的错误。非常感谢你! - bluesman80

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接