gpt4 book ai didi

java - Mockito JUnit 测试抛出异常的方法

转载 作者:行者123 更新时间:2023-11-30 02:13:54 27 4
gpt4 key购买 nike

我的服务中有一个方法,它会为一个方法调用引发异常。例如,我有这样的代码:

void myServiceMethod() {
method1(); // passes

method2(); // passes

method3(); // throws exception

method4(); // passes

method5(); // passes
}

我想要的是以某种方式处理这个method3(在实际程序中它是一个静态方法),以便程序可以继续执行进一步的代码,例如本例中的method4和method5。
在mockito junit测试中是否可以返回任何值而不是异常,或者只是跳过它?

最佳答案

你的问题实际上是两个:

1:如何避免执行模拟方法?
2:如何模拟静态方法?

以下是答案:

  1. Mockito 提供了 2 个 API 来配置您的模拟。更常见(也更易读)的是:

    when( mock.mockedMethod() ) .thenReturn(someValue);

    她的问题是真正执行了真正的方法,只是替换了结果。通常这不是问题,除非您的方法基于同一对象中其他(模拟但可能未配置)方法的返回值抛出(未经检查的)异常,或者尝试访问模拟对象依赖项的方法,因为它们是 null 以便抛出 NPE。

    一种方法是还为模拟类中的所有其他方法配置返回值。但是,您必须“打开”您的模拟类 API,提高 private 上面涉及的所有方法的可见性,仅用于测试。但是仅仅为了测试而进行这样的更改是糟糕的设计。

    为了避免您需要使用其他不执行配置方法的表单:

    doReturn(someValue).when( mock ). mockedMethod();

    请注意,右大括号从方法调用后面移动到分隔模拟变量与方法调用的点之前...

    这也可能解决您的具体示例中依赖项中的静态方法的问题。

<小时/>
  • 您声明您要模拟的方法在生产代码中是static

    这里的问题是,您首先不应该在代码中使用静态访问。因此,最好的方法是将您的方法更改为实例方法,并提供提供“serviceMethod”的类的实例。然后,您可以使用普通的 Mockito 创建模拟并替换它以轻松进行测试。

  • 有些人可能会认为您可以使用 PowerMock 来模拟 static 和/或 private 方法。虽然这在技术上是正确的,但我认为这是对糟糕设计的投降......

    关于java - Mockito JUnit 测试抛出异常的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49222781/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com