Mockito JUnit测试抛出异常的方法

时间:2018-03-11 17:12:42

标签: java junit mockito

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

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

    method2(); // passes

    method3(); // throws exception

    method4(); // passes

    method5(); // passes
}

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

1 个答案:

答案 0 :(得分:2)

你的问题实际上是两个:

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

以下是答案:

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

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

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

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

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

    private

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

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

    1. 您声明要在您的生产代码中模拟的方法是doReturn(someValue).when( mock ). mockedMethod();

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

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