gpt4 book ai didi

java - 模拟 : mock method call with parameters by reflection

转载 作者:行者123 更新时间:2023-11-29 03:15:09 25 4
gpt4 key购买 nike

我正在使用 mockito 并使用 java6 和 spring 进行开发。

我正在为一些开发人员开发一个测试 API,我提出了一些模拟对象和方法的方法(这是遗留代码......)。现在,我想用 mockito 替换所有这些东西,但我总是提出一个测试 API。所以,我开发了一些使用 mockito 的方法。

我有一个带有两个参数 (String) 的旧方法。第一个参数是模拟服务 ID 及其带参数的方法。第二个参数是返回的对象。示例:

mockReturnObject("myServiceId.myMethod(String, Integer)", myReturnedObject);

现在,我想使用 mock、when 和 thenReturn mockito 方法,但我不知道如何...也许用反射但用“when”方法是不可能的,因为 mockito 需要有效的方法。我怎样才能做到这一点 ?谢谢。

最佳答案

这是个坏主意:您正在尝试重新实现 Mockito 已经提供的一些系统,同时失去 Mockito 提供的许多功能。然而,有一种方法可以做到这一点,但有一些困难。关键是要写一个custom Answer , 使其成为 default answer对于模拟,然后使用 InvocationOnMock 比较您的对象、方法名称和方法参数类型.

public class ReflectiveMockAnswer implements Answer<Object> {
@Override public Object answer(InvocationOnMock invocation) {
// Assume you've successfully parsed each String into a StubbedResponse, with
// Object target, String method, String[] argTypes, and Object returnValue.
// A Set would beat a for-loop here, should you need to optimize.
for (StubbedResponse stubbedResponse : allStubbedResponses) {
if (stubbedResponse.target == invocation.getMock()
&& stubbedResponse.method.equals(invocation.getMethod().getName())
&& stringArraysEqual(stubbedResponse.argTypes,
typeNamesFrom(invocation.getMethod().getParameterTypes())) {
return stubbedResponse.returnValue;
}
}
throw new RuntimeException("Unstubbed method called.");
}
}

// Later...
Object yourMockObject = Mockito.mock(classToMock, new ReflectiveMockAnswer());

到那时,您已经在 Mockito 的完整版本中并基于实现了 Mockito 的简化版本。您还需要:

  • 将字符串解析为 StubbedResponse,可能使用正则表达式
  • 按名称标识待测 bean 中的字段
  • 在被测 bean 有机会与之交互之前,用上面创建的适当类的模拟替换该字段

...并承认此解决方案无法处理:

  • 验证
  • 任何类型的参数匹配,包括基本的“等于”匹配
  • 参数类型中的名称冲突(com.foo.SomeClass 与 com.bar.SomeClass)
  • 重复调用(thenReturn(1, 2, 3).thenThrow(new RuntimeException()))

...并且无法处理:

  • 代码搜索工具:您只能通过搜索字符串来判断哪些方法被模拟,而不是像 Mockito 那样使用 Eclipse 中的“查找引用”等工具
  • 编译时检查和自动重构工具:如果字段名称、方法名称或参数发生变化,您的测试将在运行时中断; Mockito 没有这个问题
  • final方法:Mockito 不能,所以你也不能

除非这是一个“稻草人”或非常临时的解决方案,否则我强烈建议将 Mockito 直接引入您的测试用例,一次一个测试。

关于java - 模拟 : mock method call with parameters by reflection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27109768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com