Mockito:当调用方法Aa时,执行Bb
我正在使用Mockito进行JUnit测试。 所以从我想要测试的代码中使用给定的A类:
class A{ public A(){} public final String a(String x){ return "Aa: " + x; } }
我想用另一个方法调用替换方法调用Aa与相同的参数和相同类型的返回值。 正如您所看到的,不可能通过扩展类来覆盖方法a,因为它是最终的。 所以我现在拥有的另一个B类方法是Bb:
class B{ public B(){} public String b(String x){ return "Bb: " + x; } }
现在我想确保每次从代码中调用Aa时,都会使用Bb的返回值。 是否有可能通过Mockito实现这一点(类似于Mockito.when(Aa(x)).thenReturn(Bb(x));
)但是使用相同的参数x,却不知道x的值?
任何帮助将不胜感激,谢谢你提前!
根据Mockito的限制 ,不可能覆盖Mockito生成的模拟的最终方法。 但是你可以在运行时使用Powermock来破解代码,这样Mockito就能完成它的工作。
好吧mockito模拟通过扩展类和重写方法来工作,在你的情况下,在Aa(String)
上是不可能的。 如果您希望发生这种情况,则必须删除最终修饰符。
现在假设Aa(String)
不是最终的,你问的是完全可以使用mockito:
given(mockA.a(anyString()).willAnswer(returnOfB(bInstance)); Answer returnOfB(final B bInstance) { return new Answer () { public String answer(Invocation invocation) { String arg = (String) invocation.getActualArguments()[0]; return bInstance.b(arg); } }; }
请注意,这个答案已写在手机上,可能有错字或错误的名字,但你应该知道应该做些什么来达到你想要的。
干杯
基本上我接受了你的设置并用它写了一个unit testing。 首先弹出的是一条错误消息,明确说明了这一点:
org.mockito.exceptions.misusing.MissingMethodInvocationException:when()需要一个必须是’模拟上的方法调用’的参数。
稍后在跟踪中它声明“你存在:final / private / equals()/ hashCode()方法。这些方法不能被存根/validation。”
因此,根据Mockito的说法,你不能存在最终方法,就是这样。
编辑:所以你必须删除最终修饰符,或者,如果你坚持使用这个类,可以找到另一种方法。