我正在研究一个小型项目,该项目在测试Java应用程序时确定代码覆盖率。它基本上包括一个用于IDE的插件,该插件可找到项目中的所有类和方法并将它们保存在数据库中;以及一个具有AspectJ切入点的代理,这些切入点编织了所有这些方法以记录其执行。

我遇到的问题是,我只想记录该项目的开发人员实际编写的方法,而不是基础库的方法。因此,切入点需要以仅编织实际项目包中的类方法的方式进行定义。另一方面,由于该代理将用于各种项目,因此我无法对这些软件包进行硬编码。

到目前为止,我的尝试是从数据库中读取所有程序包名称,并从中构建一个字符串。基本上是这样的:

private static final String POINTCUT_STRING = AspectUtil.buildPointcutString();

然后,在定义切入点时:
@Pointcut(POINTCUT_STRING)

事实是,这不起作用,因为显然在定义切入点时,

属性值必须为常数。

因此,如何使它只能在数据库中包含的包中的类中编织方法?

在此先感谢,祝您愉快!

最佳答案

我不认为动态方面方法会奏效,因为Aspectj不会使编织者遭受任何状态管理或更改。尽管从理论上讲这在运行时是可行的,但在编译时绝对是不可能的(并且您可以选择在编译时添加方面)。

但是对你的问题...

您正在使用什么编织策略?编译还是运行时?我发现编译可以很好地工作,而且我不确定如何将运行时与Aspectj一起使用。但是我能说的是,如果您使用编译,则无论如何都只会编织应用程序类,因为这就是您可以访问的全部。

要做的另一点评论是,如果您想做一些动态的事情,最好将条件放在是否要在方面的下游监视该方法的代码覆盖率。因此,当执行方面时,首先要做的是确定是否应监视此类/方法调用的覆盖范围,然后从那里继续进行...

10-08 19:33