gpt4 book ai didi

java - 使用测试用例数组调用 java 方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:04:20 24 4
gpt4 key购买 nike

首先,我知道标题有点模棱两可。其实我不知道怎么写比较好!

其次,我将描述问题。

情况:

我在在线判断 (OJ) 上练习,所以如果输出错误,OJ 会向我显示导致我的代码失败的测试用例。通常,我可以复制我的代码并将其粘贴到 Eclipse 中,然后使用该测试用例调用我的函数并调试我的代码。

但是当测试用例是对我的函数的多次调用时的问题(就像测试优先级队列的增强版本),我们假设有 n 次调用直到代码失败。所以要调试代码,我将不得不调用函数 n 次!这是不合逻辑的!

OJ 将调用的函数:

public void enqueue (int value)
{
// implementation
}
public int dequeue ()
{
// implementation
}

测试用例使代码失败:

Last executed input: enqueue(5, 3), enqueue(51, 60), enqueue(0, 14), enqueue(364, 16),... dequeue(),...

行动:

我需要一种方法来调用带有一组测试用例的函数,以便能够调试代码。

通过某种方式直接从字符串调用带有参数的函数。类似于 invoke("enqueue(5, 3)");

最佳答案

经过一些调查,我找到了一种方法来执行我需要的操作,方法是使用Java Reflection。也是一个有用的线程 What is reflection and why is it useful?

我设法开发了一个工具,这里是步骤:

  1. 将测试用例复制到一个字符串中
  2. 在每个函数调用时拆分字符串
  3. 去掉每次调用的函数名,并按顺序存储在String数组中。
  4. 拆分参数
  5. 现在我有 2 个整数数组用于 param1 和 param2,还有一个字符串数组用于调用

我使用了反射,以便能够在 for 循环内从一串调用中调用方法。

然后我们有这个

public class Test
{
public static void main(String[] args)
{
String testCase = "enqueue(5, 3), enqueue(51, 60), enqueue(0, 14), enqueue(364, 16), dequeue()";
// Prepare parameters and invocations
int[] param1; // assuming it is ready
int[] param2; // assuming it is ready
String[] calls; // assuming it is ready

try
{
Class calledClass = Class.forName("OJ.Prob3");
Method calledMethod1 = calledClass.getDeclaredMethod("enqueue", String.class, int.class);
Method calledMethod2 = calledClass.getDeclaredMethod("dequeue", null);
for (int i = 0 ; i < calls.length ; i++)
{
if (calls[i].equalsIgnoreCase("enqueue"))
calledMethod1.invoke(calledClass.newInstance(), param[i], param2[i]);
else if (calls[i].equalsIgnoreCase("dequeue"))
calledMethod2.invoke(calledClass.newInstance())
}
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (NoSuchMethodException e)
{
e.printStackTrace();
} catch (SecurityException e)
{
e.printStackTrace();
} catch (IllegalAccessException e)
{
e.printStackTrace();
} catch (IllegalArgumentException e)
{
e.printStackTrace();
} catch (InvocationTargetException e)
{
e.printStackTrace();
}
}
}

我已经测试了这个解决方案,它运行起来非常流畅,但是如果有人有更好的解决方案,我们将不胜感激。

我会把代码敲定,做成一个工具之类的,我会尽快发布,让大家调试在线评委测试用例更轻松。

更新:
您可以对静态方法执行相同的操作,只需从 calledMethod1.invoke(calledClass.newInstance(), param[i], param2[i]); 中删除 .newInstance(); 到类似 calledMethod1.invoke(calledClass, param[i], param2[i]);

关于java - 使用测试用例数组调用 java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23850385/

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