java - Jenkins Cobertura 构建 - NoClassDefFoundError

标签 java unit-testing junit jenkins cobertura

我有一个测试类ProcessorTest,其中有几行

JSONObject jsonObj = XML.toJSONObject(convert);
DBOb = (DBObject) JSON.parse(jsonObj.toString());

XML 类来自 json.org .该类在代码中的其他地方使用没有问题。

一切都在本地主机上运行良好(即,所有 Maven 和 JUnit 测试都执行)。

当我推送到 Jenkins 时,出现此错误:

Jenkins 错误

Error Details
net/sourceforge/cobertura/coveragedata/TouchCollector

Stack Trace
java.lang.NoClassDefFoundError: net/sourceforge/cobertura/coveragedata/TouchCollector
    at org.json.XML.__cobertura_init(XML.java)
    at org.json.XML.<clinit>(XML.java)
    at ProcessorTest.classSetup(ProcessorTest.java:81)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: java.lang.ClassNotFoundException: net.sourceforge.cobertura.coveragedata.TouchCollector
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 26 more

我使用的是 Jenkins 1.553 和 Cobertura 插件 1.9.6。

我该如何解决这个问题?

项目结构是这样的:

-- project1
     |
     | - core
     | - Tests (includes the tests that fail)


-- org.json
     |
     | - XML.class

当推送到 Jenkins 时,我假设 org.json 项目不可用于测试。

最佳答案

此异常和堆栈跟踪具有误导性;它实际上是因为没有 SLF4J + ch.qos.logback包含在您的类路径中(.ant/lib 路径或 ant 可用的其他类路径)。 Cobertura(至少包括 2.1.1)对 ch.qos.logback SLF4J 实现有特定要求。如果不包含此 SLF4J 实现,则会产生以下堆栈跟踪:

java.lang.NoClassDefFoundError: net/sourceforge/cobertura/coveragedata/TouchCollector
    at [org.package.ClassName].__cobertura_init([ClassName].java)
    at [org.package.ClassName].<clinit>([ClassName].java)
    at [org.package.ClassName]Test.[method]([ClassName]Test.java:113)
Caused by: java.lang.ClassNotFoundException: net.sourceforge.cobertura.coveragedata.TouchCollector
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

在我的例子中,我的 .ant/lib 类路径中已经有 slf4j-simple-1.7.14.jar,我需要删除它并替换它与 logback-core-1.0.13.jarlogback-classic-1.0.13.jar .之后,我的插桩测试用例执行时没有出现此异常。

关于java - Jenkins Cobertura 构建 - NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27565460/

相关文章:

java - 将日期从 GMT 时区转换为本地时区——使用 ISO_OFFSET_DATE_TIME

java - JUnit 如何测试迭代器

c++ - 使用 vector 操作的单元测试中未处理的 C++ 异常

javascript - 为什么输出中没有出现字符串 "nullfalse"?

java - 尝试编写毕达哥拉斯定理代码,但它没有按计划工作

java使用平面文件中的父ID创建多个树状结构

java - 使用正则表达式验证 int,我的方法不工作

java - 无法测试返回 customException 的类

java - HttpURLConnection 在mockito 中始终返回200

java - JUnit 中如何处理超时?