是否可以以通用方式拦截 mock 上的所有方法调用?
示例
给定一个供应商提供的类,例如:
public class VendorObject {
public int someIntMethod() {
// ...
}
public String someStringMethod() {
// ...
}
}
我想创建一个模拟,将 all 方法调用重定向到另一个具有匹配方法签名的类:
public class RedirectedToObject {
public int someIntMethod() {
// Accepts re-direct
}
}
Mockito 中的 when().thenAnswer() 构造似乎符合要求,但我找不到将任何方法调用与任何参数匹配的方法。无论如何,InvocationOnMock 肯定给了我所有这些细节。有没有通用的方法来做到这一点?看起来像这样的东西,其中 when(vo.*) 被替换为适当的代码:
VendorObject vo = mock(VendorObject.class);
when(vo.anyMethod(anyArgs)).thenAnswer(
new Answer() {
@Override
public Object answer(InvocationOnMock invocation) {
// 1. Check if method exists on RedirectToObject.
// 2a. If it does, call the method with the args and return the result.
// 2b. If it does not, throw an exception to fail the unit test.
}
}
);
在供应商类周围添加包装器以简化模拟不是一种选择,因为:
- 现有代码库太大。
- 对性能要求极高的应用程序的一部分。
最佳答案
我想你想要的是:
VendorObject vo = mock(VendorObject.class, new Answer() {
@Override
public Object answer(InvocationOnMock invocation) {
// 1. Check if method exists on RedirectToObject.
// 2a. If it does, call the method with the args and return the
// result.
// 2b. If it does not, throw an exception to fail the unit test.
}
});
当然,如果你想经常使用这种方法,Answer 不需要匿名。
来自 documentation :“这是一个非常高级的功能,通常你不需要它来编写像样的测试。但是在使用遗留系统时它会很有帮助。”听起来像你。
关于java - Mockito - 拦截模拟上的任何方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10839253/