Mockito:当调用方法A.a时,执行B.b

2022-09-02 13:01:19

我正在使用Mockito进行JUnit测试。因此,从我要测试的代码中使用了一个给定的类A:

class A{

    public A(){}

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

}

我想用另一个具有相同参数和相同类型返回值的方法调用替换方法调用A.a。如您所见,不可能通过扩展类来重写方法 a,因为它是 final。所以我现在有的是另一个带有方法B.b的B类:

class B{

    public B(){}

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

}

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

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


答案 1

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

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

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);
         }
    };
}

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

干杯


答案 2

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


推荐