【问题标题】:How to unmock an exception using Mockito?如何使用 Mockito 取消模拟异常?
【发布时间】:2021-09-08 13:54:32
【问题描述】:

我正在尝试为各种结果模拟一个函数。首先,我嘲笑它抛出异常如下:

Mockito.when(ClassName.methodName(Matchers.any(), Matchers.any())).thenThrow(new ExceptionName());

现在,我想模拟一个返回一些输出的案例。所以,我尝试如下:

    Mockito.when(ClassName.methodName(Matchers.any(), Matchers.any())).thenReturn(output);

但它正在抛出异常(可能是因为我已经模拟它抛出异常)

我应该如何解开它,以便我可以使用它来提供正确的输出?

【问题讨论】:

    标签: unit-testing exception junit mockito spring-boot-test


    【解决方案1】:

    您可以使用Mockito.reset() 清除您对特定模拟所做的任何模拟设置。

    注意:通常最好使您的测试更小,这样您就不需要使用reset。如果您使用@MockBean,则默认情况下在每个测试方法之后重置模拟。可以通过注解上的reset 参数更改此默认行为。

    【讨论】:

    • 是否有任何其他方法可以仅针对特定功能进行重置?因为我也模拟了其他函数,并且这个方法也可能重置其他方法的模拟。
    • 您是手动创建模拟实例吗?还是您使用@Mock 注释?还是你使用@MockBean注解?
    • 我正在使用@MockBean 注解来创建实例
    【解决方案2】:

    您可以为多个调用定义模拟行为,如下所示:

    when(ClassName.methodName(any(),any()))
                    .thenThrow(RuntimeException.class)
                    .thenReturn(output)
                    .thenCallRealMethod();
    

    当你的 mock 第一次在服务中被调用时,它会抛出 RuntimeException,第二次会返回 output,第三次会调用一个真正的方法。

    【讨论】:

      【解决方案3】:

      您可以使用@Nested 创建嵌套类并将所有异常方法移入其中,并仅为这些函数创建单独的设置。这种结构将帮助您隔离所有相似的方法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-25
        • 1970-01-01
        • 1970-01-01
        • 2018-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多