Mockito - 拦截模拟上的任何方法调用



是否可以以通用方式拦截模拟上的所有方法调用?

给定供应商提供的类,例如:

public class VendorObject {
    public int someIntMethod() {
        // ...
    }
    public String someStringMethod() {
        // ...
    }
}

我想创建一个模拟,将所有方法调用重定向到另一个有匹配方法签名的类:

public class RedirectedToObject {
    public int someIntMethod() {
        // Accepts re-direct
    }
}

Mockito中的when().thenAnswer()结构似乎符合要求,但我找不到将任何方法调用与任何参数匹配的方法。 无论如何,InvoOnMock肯定给了我所有这些细节。 有没有通用的方法可以做到这一点?看起来像这样的东西,其中 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.
        }
    }
);

在供应商类周围添加包装器以使模拟变得容易不是一种选择,因为:

  1. 现有代码库太大。
  2. 性能极其关键的应用程序的一部分。

我认为你想要的是:

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。

来自文档:"这是非常高级的功能,通常您不需要它来编写像样的测试。但是,在使用遗留系统时,它会有所帮助。 听起来像你。

相关内容

  • 没有找到相关文章

最新更新