获取执行代码的行号

时间:2013-05-02 11:06:55

标签: java

我正在编写一个自动生成单元测试用例的应用程序。应用程序将.java文件作为输入,然后处理它以查找其所有方法。然后使用以下命令使用测试数据调用这些方法。        method.invoke(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();

1 个答案:

答案 0 :(得分:0)

您可以阅读保护工具如何收集其统计信息here

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

例如:

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));
  }
}

您将无法仅从方法签名生成此代码的测试。您将不得不引入测试数据,这可能可行地定义它适用于哪种方法,但是除了这样的简单情况之外,数据将成为测试用例,而您所实现的只是引入额外的复杂层

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