我的服务中有一个方法,它会抛出一个方法调用的异常。例如,我有一个代码:
void myServiceMethod() {
method1(); // passes
method2(); // passes
method3(); // throws exception
method4(); // passes
method5(); // passes
}
我想要的是处理这个方法3(在实际程序中它是一个静态方法),在某种程度上,这样程序可以继续执行更多的代码,例如本例中的method4和method5。
是否有可能在mockito junit测试中返回任何值而不是异常,或者只是跳过它?
答案 0 :(得分:2)
你的问题实际上是两个:
1:如何避免执行模拟方法?
2:我如何模拟static
方法?
以下是答案:
Mockito提供2个API来配置您的模拟。更常见(也更易读)是:
when( mock.mockedMethod() ) .thenReturn(someValue);
她的问题是真正的方法实际执行了,只是结果被替换了。通常这不是问题,除非您的方法基于同一对象中的其他(模拟但可能是未配置的)方法的返回值抛出(未经检查的)异常,或者尝试访问模拟对象的依赖关系的方法,因为它们是{{1这样就可以抛出一个NPE。
一种方法是为mocked类中的所有其他方法配置返回值。但是,您必须“打开”您的模拟类API,以提高上面null
所涉及的所有方法的可见性,仅用于测试。但是仅仅为了测试而做出这样的改变是糟糕的设计。
为避免您需要使用不执行已配置方法的其他表单:
private
请注意,右括号从方法调用后面移动到将模拟变量与方法调用分开的点之前...
这也可以解决您在具体示例中依赖静态方法的问题。
您声明要在您的生产代码中模拟的方法是doReturn(someValue).when( mock ). mockedMethod();
。
这里的问题是您不应该首先在代码中使用静态访问。因此,最好的方法是将方法更改为实例方法,并提供提供“serviceMethod”的类的实例。然后你可以使用普通的Mockito创建一个模拟并替换它以便于测试。
有些人可能会争辩说你可以使用 PowerMock 来模拟static
和/或static
方法。虽然这在技术上是正确的,但我认为这是对你的糟糕设计的投降 ......