当前位置: 首页 > 知识库问答 >
问题:

mockito:通过反射调用带有参数的模拟方法

窦宏旷
2023-03-14

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

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

共有1个答案

邓子濯
2023-03-14

这是一个坏主意:您试图重新实现Mockito已经提供的一些系统,同时失去了Mockito提供的许多特性。然而,有一种方法使这起作用,有一些困难。关键是编写一个自定义答案,使其成为mock的默认答案,然后使用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有机会与该字段交互之前,将该字段替换为如上所述创建的适当类的模拟
    null
  • 代码搜索工具:您只能通过搜索字符串,而不是像Mockito那样使用Eclipse中的“find references”之类的工具
  • 来判断哪些方法被嘲弄
  • 编译时检查和自动重构工具:如果字段名、方法名或参数更改,测试将在运行时中断;Mockito没有这个问题
  • 最终方法:Mockito不能,所以您也不能

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

 类似资料:
  • 有人能告诉我原因或上面代码的更好替代方案吗?

  • 我有一个方法如下: 为了通过反射调用此函数,我尝试了以下代码段,但结果不成功: 那么,有没有一种方法可以通过Java反射调用像findEntity这样的方法? 谢谢

  • 问题内容: 有没有一种使用通用参数模拟类的干净方法?说我必须模拟一个类,我需要将该类传递给需要一个的方法。我可以很容易地做到以下几点: 假定返回通用类型。但是,当我稍后将其传递给期望的方法时,将会有小猫。铸造是这样做的唯一方法吗? 问题答案: 我认为您确实需要强制转换,但应该不会太糟:

  • 我正在尝试模拟一个静态void方法,该方法采用参数 我的下属:

  • 如果反射值对象(reflect.Value)中值的类型为函数时,可以通过 reflect.Value 调用该函数。使用反射调用函数时,需要将参数使用反射值对象的切片 []reflect.Value 构造后传入 Call() 方法中,调用完成时,函数的返回值通过 []reflect.Value 返回。 下面的代码声明一个加法函数,传入两个整型值,返回两个整型值的和。将函数保存到反射值对象(refle