尝试调用cobertura检测类中的方法时抛出NoSuchMethodException

时间:2015-02-09 18:36:25

标签: java reflection osgi instrumentation cobertura

我有一个由一堆OSGI包组成的webapp。要求是在部署的工件上运行自动化测试时生成cobertura代码覆盖率报告。 为此我已经使用cobertura检测了可部署工件,如上所述here 执行所有必需的设置,并能够生成检测类和相应的可部署工件“.war”。并在wildfly中成功部署。 但是,在访问应用程序并执行少量捕获覆盖的操作后,尝试停止服务器(jboss shutdown挂钩将调用所需的cobertura类并生成用于创建覆盖率报告的cobertura.ser文件),这导致以下例外

2015-02-09 17:46:06,420 SEVERE [net.sourceforge.cobertura.coveragedata.TouchCollector] (Thread-84) Cannot apply touches: java.lang.NoSuchMethodException: com.sample.package.SomeInstrumentedClass.__cobertura_classmap(net.sourceforge.cobertura.coveragedata.LightClassmapListener)
at java.lang.Class.getDeclaredMethod(Class.java:1994) [rt.jar:1.7.0_25]
at net.sourceforge.cobertura.coveragedata.TouchCollector.applyTouchesToSingleClassOnProjectData(TouchCollector.java:125) [admin-rest-api-1.0.0.jar:1.0.0]
at net.sourceforge.cobertura.coveragedata.TouchCollector.applyTouchesOnProjectData(TouchCollector.java:107) [admin-rest-api-1.0.0.jar:1.0.0]
at net.sourceforge.cobertura.coveragedata.ProjectData.saveGlobalProjectData(ProjectData.java:270) [admin-rest-api-1.0.0.jar:1.0.0]
at net.sourceforge.cobertura.coveragedata.SaveTimer.run(SaveTimer.java:32) [admin-rest-api-1.0.0.jar:1.0.0]
at java.lang.Thread.run(Thread.java:724) [rt.jar:1.7.0_25]

对于cobertura尝试访问的所有类,抛出此异常。当我解压缩已部署的工件时,我可以看到所有使用cobertura特定代码和所有已检测类中存在的特定方法__cobertura_classmap的类。尽管在部署的工件中实际存在该方法,但无法弄清楚为什么NoSuchMethodException被抛出。

我正在使用cobertura-2.0.3,cobertura-maven-plugin-2.6和java版本1.7.0_71以及Apache Felix

有没有人遇到过这个问题? OSGI是否与此行为有关?

1 个答案:

答案 0 :(得分:0)

我对Cobertura 2.1.1,Java 1.8.0_72& Java 1.7.0_79,其中检测类确实包含了它抱怨的方法。

我在我的项目中修改了这个Cobertura问题,将我的内部类(扩展了Cobertura所抱怨的内容)从我的单元测试类中移到了自己的类文件中。

我还必须将我的一个变量从有问题的类中移到一个独立的类中。变量曾经是Gson TypeToken:

com.google.gson.reflect.TypeToken GSON_TYPE_TOKEN = new TypeToken<MyJsonStructure>(){};

所以我的建议是尝试避免内部类。