Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在获取已执行代码的行号_Java - Fatal编程技术网

Java 正在获取已执行代码的行号

Java 正在获取已执行代码的行号,java,Java,我正在编写一个用于自动生成单元测试用例的应用程序。该应用程序将一个.java文件作为输入,然后对其进行处理以查找其所有方法。然后使用以下命令使用测试数据调用这些方法。 调用(classObj,MethodArg); 现在,我希望找到在调用的方法中执行的行,以计算覆盖率。我曾尝试使用StackTrace()执行此操作,但它给出了应用程序代码的行号。 有人能帮我吗。我完全迷路了。我们将非常感谢您的帮助。 我目前的代码是: Runnable myRunnable; myRunnable

我正在编写一个用于自动生成单元测试用例的应用程序。该应用程序将一个.java文件作为输入,然后对其进行处理以查找其所有方法。然后使用以下命令使用测试数据调用这些方法。 调用(classObj,MethodArg); 现在,我希望找到在调用的方法中执行的行,以计算覆盖率。我曾尝试使用StackTrace()执行此操作,但它给出了应用程序代码的行号。 有人能帮我吗。我完全迷路了。我们将非常感谢您的帮助。 我目前的代码是:

    Runnable myRunnable;
    myRunnable = new Runnable(){
    public void run(){
    try { 
      int returnValInt = (int) fm.invoke(fobj, fargs);
      System.out.println(new Exception().getStackTrace()[0].getLineNumber());                                  
    } catch (IllegalAccessException ex) {
      Logger.getLogger(HelloWorldFrame.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalArgumentException ex) {
      Logger.getLogger(HelloWorldFrame.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InvocationTargetException ex) {
      Logger.getLogger(HelloWorldFrame.class.getName()).log(Level.SEVERE, null, ex);
    }
  }
};
Thread th= new Thread(myRunnable, "th");
th.start();

您可以阅读覆盖率工具如何收集其统计数据

但在此之前,您尝试做的并没有多大用处——任何测试的全部目的都是测试一段代码的意图。要做到这一点,你需要知道边界是什么,你期望结果是什么

例如:

public class Math
{
  public static long add(long a, long b)
  {
    return a + b;
  } 

  public static long multiply(long a, long b)
  {
    return a * b;
  } 
}

public class MathTest
{
  @Test
  public void testAdd()
  {
    assertTrue(5, Math.add(2, 3));
  }

  @Test
  public void testMultiply()
  {
    assertTrue(6, Math.multiply(2, 3));
  }
}
您将无法仅从方法签名生成此代码的测试。您必须引入测试数据,这可能会定义它适用于哪种方法,但是在像这样简单的情况下,数据将成为测试用例,您所实现的只是引入额外的复杂性层


在一天结束时,单元测试是您的测试数据,在这里可以很好地定义测试规范。

newexception()
是在代码中的一行创建的。所以它当然会在代码中引用这一行。是否有任何原因导致您创建自己的测试框架而不使用标准框架,例如JUnit?我怀疑这就是代码覆盖率的实现方式。我认为您可能希望VM代理执行一些低级跟踪。