gpt4 book ai didi

java - 使用 Mockito 通过反射模拟方法

转载 作者:搜寻专家 更新时间:2023-11-01 01:00:50 24 4
gpt4 key购买 nike

我们正在使用 Mock-Factory 为我们的开发人员提供最舒适的模拟功能,同时尽可能少地了解 mockito 本身。

为此,我们的 Mock-Factory 提供了一种方法来创建一个模拟,给定类名、方法名(通过正则表达式)和给定的返回值,它看起来如下(清理相关部分对于这个问题):

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;
}

如您所见,方法名称与名称(正则表达式)和正确的给定返回类型相匹配。

它工作正常,但我有点担心我必须构建人工参数数组 params!不,方法

Mockito.when (m.invoke (mockForService, Mockito.anyVararg ())).thenReturn(methodResponse);

没用!但我真的不明白为什么!?

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

最佳答案

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

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

Mockito 不需要在其之上的其他专有 API。因此,我建议的替代方案是忘记这一点,并向您的开发人员教授 Mockito。

关于java - 使用 Mockito 通过反射模拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15970810/

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