对抛出异常的方法进行模拟 JUnit 测试



我的服务中有一个方法,它为一个方法调用抛出异常。例如,我有一个代码,如下所示:

void myServiceMethod() {
method1(); // passes
method2(); // passes
method3(); // throws exception
method4(); // passes
method5(); // passes
}

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

你的问题实际上是两个:

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

以下是答案:

  1. Mockito提供了2个API来配置你的模拟。更常见(且更具可读性)的是:

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

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

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

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

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

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

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


  1. 您说要模拟的方法static在您的生产代码中。

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

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

相关内容

  • 没有找到相关文章

最新更新