【问题标题】:How to stub an exception multiple times in Mockito如何在 Mockito 中多次存根异常
【发布时间】:2015-09-25 20:40:10
【问题描述】:

我想对一个方法调用进行 40 次存根处理,然后处理一个异常,然后处理一个真实对象。据我所知,Mockito 1.10.8 的 thenThrow() 方法接受 n 个 Throwables:

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: 不能用 null throwable 存根! 在 MyObjectTest.test(MyObjectTest.java:105)

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

为什么会出现这个错误?

【问题讨论】:

  • 如果你替换为thenThrow(new ConnectionException("exception message")) - 它仍然会抛出 MockitoException 吗?
  • 不,它没有。实际上,同一个测试类中的其他测试之一就是这样做的,并且顺利通过。
  • 我不明白你需要什么。你能写更多关于你的期望吗?
  • @Fariba 我想测试 papa.getMapper().map() 方法是否被调用了 41 次。因为,我的测试类只要抛出 ConnectionException 就会调用这个方法,但最多 40 次。
  • @bluesman80 我会检查您的exceptions 对象是否已使用 Arrays.fill() 正确填充。确保数组内的值不为空

标签: java unit-testing junit mockito


【解决方案1】:

您收到此异常是因为您有一个包含 41 个元素的 Throwable[],但您只用实际的 ConnectionException 值填充其中的 40 个。最后一个是null

thenThrow 不接受投掷null (which would cause a NullPointerException to be thrown instead)。

你的数组应该只包含 40 个元素

Throwable[] exceptions = new Throwable[40];

【讨论】:

  • 我不敢相信我已经为此苦苦挣扎了好几个小时!原来是一个愚蠢的错误。非常感谢!
猜你喜欢
  • 2019-07-28
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
相关资源
最近更新 更多