首页 > 解决方案 > 在 JAVA/ANDROID 中为方法动态添加参数、参数类型和参数值

问题描述

如何动态地将参数、参数类型和参数值添加到 java 中的方法。

下面给出了一个测试用例方法名称testBlockTest104的示例。同样有 1000 个测试用例。我可以在运行时使用反射获取方法名称,但无法动态添加参数、参数类型和参数值。我的目的是根据参数的数量和类型运行数千个不同的方法名称和参数类型及其值的测试用例。

基本上传递变量参数数字,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)形式提供给测试人员的一个测试引擎框架的一部分,测试用例的类型可以由测试人员提供(以 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 文件进行自定义。这只是我提到的目的的顶级视图。

标签: javaandroid

解决方案


任何采用可变参数的参数(如 getMethod)都可以传递给数组。所以你可以创建一个Class[],将所有参数Class对象放入其中,然后将其传递给getMethod。调用相同。

虽然我真的认为你应该重新考虑这种方法。使用这种基于 xml 的方法,您正在使您的测试变得更慢和更复杂,而没有真正的好处。它甚至不像您可以将其传递给非程序员来编写测试,因为用户仍然需要了解足够的编程知识才能知道函数是什么以及参数是什么。您所要做的就是减慢您的组织速度,因为运行测试套件将花费正常时间的 10 倍。


推荐阅读