繁体   English   中英

Mockito JUnit对引发异常的方法进行测试

[英]Mockito JUnit test on method which throws exception

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

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

    method2(); // passes

    method3(); // throws exception

    method4(); // passes

    method5(); // passes
}

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

您的问题实际上是两个:

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

答案如下:

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

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

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

    一种方法是还为模拟类中的所有其他方法配置返回值。 但是随后,您必须通过提高所有private方法所涉及的所有方法的可见性来“开放”您的模拟类API,仅用于测试。 但是仅出于测试目的进行此类更改是不好的设计。

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

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

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

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


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

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

有人可能会说您可以使用 PowerMock 模拟static和/或private方法。 虽然从技术上讲这是正确的,但我还是认为这是对您不良设计的屈服 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM