问题描述
是否可以通用方式拦截模拟上的所有方法调用?
Is it possible to intercept all method invocations on a mock in a generic way?
示例
鉴于供应商提供的类如下:
Given a vendor provided class such as:
public class VendorObject {
public int someIntMethod() {
// ...
}
public String someStringMethod() {
// ...
}
}
我想创建一个重定向所有方法调用另一个匹配方法签名的类:
I would like to create a mock that re-directs all method calls to another class where there are matching method signatures:
public class RedirectedToObject {
public int someIntMethod() {
// Accepts re-direct
}
}
Mockito中的when()。thenAnswer()构造似乎符合要求,但我找不到任何方法调用与任何args匹配的方法。无论如何,InvocationOnMock肯定会给我所有这些细节。有没有通用的方法来做到这一点?看起来像这样的东西,其中when(vo。*)被适当的代码替换:
The when().thenAnswer() construct in Mockito seems to fit the bill but I cannot find a way to match any method call with any args. The InvocationOnMock certainly gives me all these details anyway. Is there a generic way to do this? Something that would look like this, where the when(vo.*) is replaced with appropriate code:
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.
}
}
);
在供应商类周围添加包装以使模拟变得容易,因为:
Adding wrappers around the vendor classes to make mocking easy is not an option because:
- 现有代码库太大。
- 部分性能极为关键的应用程序。
推荐答案
我想你想要的是:
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.
}
});
当然,如果你想经常使用这种方法,那么答案就不需要是匿名的。
Of course, if you want to use this approach frequently, no need for the Answer to be anonymous.
来自:它是非常高级的功能,通常你不需要它来编写体面的测试。但是在使用遗留系统时它会很有用。听起来像你。
From the documentation: "It's quite advanced feature and typically you don't need it to write decent tests. However it can be helpful when working with legacy systems." Sounds like you.
这篇关于Mockito - 拦截模拟上的任何方法调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!