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

利用Mockito通过反射模拟方法

孔砚
2023-03-14
public <T> T getMockForMethod(Class<T> clazz, String methodName, Object methodResponse)
{
  T mockForMethod = mock(clazz);
  for (Method m : clazz.getDeclaredMethods ())
  {
    if (m.getName ().matches (methodName) && 
        m.getReturnType ().isAssignableFrom (methodResponse.getClass ()))
    {
      try
      {
         Class<?>[] paramTypes = m.getParameterTypes ();
         Object[] params = new Object[paramTypes.length];
         for (Object o : params)
         {
           o = Mockito.anyObject ();
         }
         Mockito.when (m.invoke (mockForService, params)).thenReturn (methodResponse);
      }
      catch (IllegalArgumentException e)
      {
        e.printStackTrace (System.err);
      }
      catch (IllegalAccessException e)
      {
        e.printStackTrace (System.err);
      }
      catch (InvocationTargetException e)
      {
        e.printStackTrace (System.err);
      }
    }
  }
  return mockForMethod;
}
Mockito.when (m.invoke (mockForService, Mockito.anyVararg ())).thenReturn(methodResponse);

有人能告诉我原因或上面代码的更好替代方案吗?

共有1个答案

裴俊能
2023-03-14

你不该这么做。Mockito是一个设计良好、易于学习、文档非常丰富、几乎是事实上的标准框架。而且它是类型安全的,不需要反射,这使得测试易于阅读和理解。

让您的开发人员学习真正的Mockito,并直接使用它的API。他们会很乐意使用它,因为它比您自己的超级API有更好、更容易使用和更灵活的设计,他们会知道他们不会白学Mockito,因为他们可能会在其他项目甚至其他工作中使用它。

Mockito不需要另一个专有API在它之上。因此,我建议的替代方案是忘记这一点,将Mockito教给您的开发人员。

 类似资料:
  • 我正在使用mockito并使用java6和Spring进行开发。

  • 我一直在试图理解嘲笑是如何工作的。我读过各种回应,似乎有一个相互矛盾的论点,Mockito是否在内部使用反射。 这里,它清楚地说明了mockito不使用反射:https://stackoverflow.com/questions/15970810/using-mockito-to-mock-methods-by-reflection#:~:text=mockito%20is%20a%20realt

  • 使用mockito模拟一个方法会确保永远不会调用被模拟的方法吗?我有一个主类,它包含一些我想为其编写单元测试的代码,还有一个单元测试类MainTest,它包含主类的单元测试。 eg: 源类: JUnit测试(使用mockito) 这项测试失败了。为什么?

  • 我想在类AppleProcessor中测试一个方法: 请注意,Fruit是AppleFruit实现的方法的接口,并且还有一个方法。 我的测试看起来像: 然而,我得到了以下错误:

  • 问题内容: 我已经写了一家工厂来生产物体: 我想验证传递给的参数,但不知道如何模拟静态方法。我在测试用例中使用的是和。有没有模拟或验证此特定用例的好方法? 问题答案: 在Mockito上使用PowerMockito。 示例代码: