Mockito:当调用方法Aa时,执行Bb

use*_*982 15 java junit unit-testing junit4 mockito

我正在使用Mockito进行JUnit测试.所以从我想要测试的代码中使用给定的A类:

class A{

    public A(){}

    public final String a(String x){
        return "A.a: " + x;
    }

}
Run Code Online (Sandbox Code Playgroud)

我想用另一个方法调用替换方法调用Aa与相同的参数和相同类型的返回值.正如您所看到的,不可能通过扩展类来覆盖方法a,因为它是最终的.所以我现在拥有的另一个B类方法是Bb:

class B{

    public B(){}

    public String b(String x){
        return "B.b: " + x;
    }

}
Run Code Online (Sandbox Code Playgroud)

现在我想确保每次从代码中调用Aa时,都会使用Bb的返回值.是否有可能通过Mockito(类似的东西Mockito.when(A.a(x)).thenReturn(B.b(x));)实现这一点,但使用相同的参数x,而不知道x的值?

任何帮助将不胜感激,谢谢你提前!

Bri*_*ice 20

好吧mockito模拟通过扩展类和重写方法来工作,在你的情况下是不可能的A.a(String).如果您希望发生这种情况,则必须删除最终修饰符.

现在假设A.a(String)不是最终的,你问的是完全可以使用mockito:

given(mockA.a(anyString()).willAnswer(returnOfB(bInstance));

Answer<String> returnOfB(final B bInstance) {
    return new Answer<String>() {
         public String answer(Invocation invocation) {
             String arg = (String) invocation.getActualArguments()[0];
             return bInstance.b(arg);
         }
    };
}
Run Code Online (Sandbox Code Playgroud)

请注意,这个答案已写在手机上,可能有错字或错误的名称,但你应该知道应该做些什么来实现你想要的.

干杯

  • @ sergej-zagursky有解决最终修饰语问题的答案,但是这个问题回答了原始问题的要点.这就是你将返回值建立在`x`值的基础上. (3认同)

Ser*_*sky 3

根据Mockito 限制,不可能覆盖 Mockito 生成的模拟的最终方法。但是您可以使用Powermock在运行时破解代码,以便 Mockito 可以完成其工作。

  • 这解决了“最终”问题,@brice 的答案回答了您原来问题的要点。 (3认同)