我正在使用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(类似Mockito.when(A.a(x)).thenReturn(B.b(x));
)实现这一点,但使用相同的参数x,而不知道x的值?
任何帮助都将不胜感激,提前感谢!
好的mockito mocks通过扩展类和重写方法来工作,在您的情况下,这在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);
}
};
}
请注意,这个答案是写在手机上的,可能有拼写错误或名字错误,尽管你应该知道应该做些什么来实现你想要的。
干杯
根据Mockito的限制,不可能覆盖Mockito生成的mock的最终方法。但是您可以在运行时使用Powermock来破解代码,这样Mockito就可以完成它的工作。
基本上,我接受了你的设置,并用它编写了一个单元测试。首先弹出的是一条错误消息,明确指出:
org.mockito.exceptions.missing.MissingMethodInvocationException:when()需要一个参数,该参数必须是"对mock的方法调用"。
在随后的跟踪中,它指出"您可以存根:final/private/equals()/hashCode()方法中的任何一个。这些方法不能被存根/验证。"
所以根据Mockito的说法,你不能截尾最终的方法,仅此而已。
编辑:所以你必须删除最后一个修饰符,或者,如果你被这个类卡住了,就另辟蹊径