如何在Java中向方法动态添加参数,参数类型和参数值。
下面提供的是一个测试用例方法名称 testBlockTest104 的示例。类似地,有1000个tescases。我可以在运行时使用反射来获取方法名称,但无法获得动态添加参数的方法,参数类型和参数值。 我的目的是要运行成千上万个测试用例,它们的方法名称,参数类型及其值基于参数的数量和类型而有所不同。
基本上传递变量参数数字,getMethod()中的类型和.invoke()方法中的值。
String methodName = "testBlockTest104";
try {
Method m = testBlock.getClass().getMethod(methodName, testParam1.unit1.class, testParam2.unit2.class,resultcallback.result.class);
try {
m.invoke(testBlock, unit1_value, unit2_value,resultcallback_val);
}
catch(Exception ex)
{
Log.i("Exception=> " + ex.getMessage());
}
} catch (SecurityException e1) {
Log.i("Exception=> " + e1.getMessage());
}
catch (NoSuchMethodException e2) {
Log.i("Exception=> " + e2.getMessage());
}
我已经成功地通过反射调用了一个方法(通过从文本文件中读取方法名称)。但是我想要实现这一点。
Purpose 1:
这是二进制(exe / apk)形式提供给测试人员的一个Test Engine框架的一部分,其中测试用例的类型可以由测试人员提供(采用xml格式。测试人员不了解代码) )xml将由测试引擎(上面的代码)进行解析,并基于该引擎派生方法。
例如下面的XML:
<test-id-103>
<method-name>
<method-params>
</method-params>
<method-types>
</method-types>
<method-values>
</method-values>
</method-name>
</test-id-103>
Purpose 2:
好的,所以上面的目的在某些人看来可能并不合理,因此我记下了这种方法的另一个目的。尽管更多的是项目管理方面的,而不是技术方面的。编写此测试引擎的开发人员将离开公司,他将要编写的静态测试用例(如果不是这种方法)将类似于编写具有固定硬编码值的测试用例,一旦他离开就无法再更改。因此,通过上述方法,测试人员可以传递任何值,任何参数喜欢给定的测试用例,因此不依赖开发人员的代码。整个XML将被解析为一个大缓冲区,该缓冲区将在运行测试用例时进行解析(我认为这不会花费很多时间)。可以通过编辑一个简单的xml文件来自定义测试用例。这只是我提到的目的的顶层视图。
答案 0 :(得分:1)
可以将带有可变参数的ANy参数(如getMethod)传递给数组。因此,您可以创建Class [],将所有参数Class对象放入其中,然后将其传递给getMethod。相同。
尽管我真的认为您应该重新考虑这种方法。使用这种基于xml的方法会使您的测试变得更加缓慢和复杂,而没有真正的好处。它甚至不像您可以将其传递给非程序员来编写测试,因为用户仍然需要了解足够的编程知识才能知道功能和参数是什么。您要做的只是减慢组织速度,因为运行测试套件将花费正常时间的10倍。