Reflection 用Mockito模拟java.lang.Class getDeclaredMethod(字符串名称,…类参数)不起作用

Reflection 用Mockito模拟java.lang.Class getDeclaredMethod(字符串名称,…类参数)不起作用,reflection,mocking,mockito,java.lang.class,Reflection,Mocking,Mockito,Java.lang.class,我试图在某个定义的java类型的java.class对象上模拟getDeclaredMethod: AccessRulesMethods accessRulesMock = mock(AccessRulesMethods.class); Method mockMethod = mock(Method.class); when(accessRulesMock.getClass().getDeclaredMethod(param.getValue(), String.class, BigIntege

我试图在某个定义的java类型的java.class对象上模拟getDeclaredMethod:

AccessRulesMethods accessRulesMock = mock(AccessRulesMethods.class);
Method mockMethod = mock(Method.class);
when(accessRulesMock.getClass().getDeclaredMethod(param.getValue(), String.class, BigInteger.class)).thenReturn(mockMethod); 
但我有以下例外:

java.lang.NoSuchMethodException: myOwnPackage.AccessRulesMethods.methodName(java.lang.String, java.math.BigInteger)
at java.lang.Class.getDeclaredMethod(Class.java:2130)
查看第2130行的java.lang.Class,该方法似乎根本没有被模仿。我在这里的另一次讨论中发现,这是正确的方法,但没有示例。。。 有人知道我怎样才能得到我需要的东西吗

非常感谢, 萨维里奥

业务逻辑:

try {
                    Method method = AccessRulesMethods.class.getDeclaredMethod(name, String.class, BigInteger.class);
                    String parameterName = Arrays.asList(method.getParameters()).get(0).getName();
                    Field inputField = input.getClass().getDeclaredField(parameterName);
                    inputField.setAccessible(true);
                    String parameterValueFromInput = (String) inputField.get(input);
                    AccessRulesMethods accessRulesInstance = beanFactory.getBean(AccessRulesMethods.class);
                    methodOutput = (MethodOutput) method.invoke(accessRulesInstance, parameterValueFromInput, input.getIdBp());
                }catch (InvocationTargetException ite){
                    throw ite.getTargetException();
                }catch (NoSuchMethodException | IllegalAccessException | NoSuchFieldException e) {
                    throw new CoreApplicationException("Errore tecnico: invocazione metodo fallita", ErrorConstant.getLocalErrorKey(ErrorConstant.LOCAL_ERROR_CODE_ERRVISREFL001), HttpStatus.INTERNAL_SERVER_ERROR);
                }

我有一个带有一些方法的bean:AccessRulesMethod。我从数据库中的一个表中获取方法名,然后以给定的顺序使用反射调用这个方法。为了调用这些方法,首先我获取所需参数的名称(第二个参数是固定的),然后我将该参数从输入传递到API,同时使用反射

在引用该参数时,您应该提供指向“另一个讨论”的链接。据我所知,
when
必须包含一个方法调用来描述要模拟的方法。您有两个链式方法调用,
getClass()
getDeclaredMethod
。您不能通过更改(模拟)类
AccessRulesMethods
@Holger来更改类
java.lang.class
中方法
getDeclaredMethod
的行为谢谢您的回答。以下是我之前遇到的讨论的链接:。你可以看到提出问题的人在回答中给出了一个建议,说这是正确的方法。我当然错过了一些东西。你说的改变行为到底是什么意思?我想模拟getDeclaredMethod,因为它在我的业务逻辑中被调用。我将在另一条评论中添加我的业务逻辑。有可能实现我想要的吗?@Holger我编辑了这个问题以添加一些业务逻辑注意链接答案中的示例如何包含对
getDeclaredMethod
的单个方法调用,而不包含
getClass
调用。模拟对象必须是调用
getDeclaredMethod
实例。“嘲弄”意味着“改变行为”。在特定场景中,您希望方法的行为更改为
然后返回(mockMethod)
。这就是它的全部内容。@不幸的是,霍尔格不可能模仿这个班级。。。Mockito不允许此操作,也不允许powermock。。。