1.在测试一个单元测试时,先用junit测试,能够通过。又想看一下覆盖率,就用EclEmma来再次运行,发现测试不能运行。网上一找 “ 对于 Java Application 和 JUnit 类型的覆盖测试,我们可以在配置对话框中选中“In-place instrumentation”项来指定直接修改 Workspace 中的 .class 文件和 .jar 文件。”
这样的信息。因为通常代码覆盖测试工具都需要对被执行的代码进行修改。那就在
再Open Coverage Dialog...
出现
选中“In-place instrumentation”, 再次点击,测试通过。
但又用junit测试时就出现了java.lang.NoClassDefFoundError: com/vladium/emma/rt/RT异常,这是怎么回事呢?
通过查看Emma的工作原理:
- 预插入模式:对程序进行测量之前,需要采用 Emma 提供的工具对 class 文件或者 jar 文件进行修改。修改完成之后的代码可以立刻被执行。覆盖测试的结果将会被存放到指定的文件中。
- 即时插入模式:即 时插入模式不需要事先对代码进行修改。相反,对代码的修改是通过一个 Emma 定制的 Class loader(类载入器)进行的。这种方式的优点很明显,我们不需要对 class 或者 jar 文件进行任何修改。缺点是我们为了获得测试的结果,需要用 Emma 提供的命令 emmarun 来执行 Java 应用程序。
就知道解决方法了:
把测试相关的类重新编译,就可以通过junit的测试了。
参见:
使用 EclEmma 进行覆盖测试
http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/index.html