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的说法,你不能存在最终方法,就是这样。

编辑:所以你必须删除最终修饰符,或者,如果你坚持使用这个类,可以找到另一种方法。