从 DOS 命令行运行 JUnit 测试时出错

Posted

技术标签:

【中文标题】从 DOS 命令行运行 JUnit 测试时出错【英文标题】:Error when running JUnit Tests from DOS Command line 【发布时间】:2014-04-21 13:44:02 【问题描述】:

我的项目在 Windows 2008 Server 上运行。

我的项目源代码位于以下文件夹中:

com.company.division.dao
com.company.division.entity
com.company.division.main
com.company.division.junit

我的 junit 测试类在文件夹 C:\Sample\com\company\division\junit 中。 我正在使用 JUnit 4.11

当我从 Eclipse 运行它时,它运行良好。

我从 DOS 命令行尝试了以下操作:

首先我 cd C:\Sample\com\company\division\junit\

从 C:\Sample\com\company\division\junit> 我运行已编译的 EventTests.class 文件所在的位置:

java  -classpath "C:\Sample\lib\junit.jar;" org.junit.runner.JUnitCore com.company.division.junit.EventTests

java  -cp "C:\Sample\lib\junit.jar;" org.junit.runner.JUnitCore com.company.division.junit.EventTests

java  -cp ".;C:\Sample\lib\junit.jar;" org.junit.runner.JUnitCore com.company.division.junit.EventTests

但似乎没有任何效果。我得到一个例外:

JUnit version 4.11
Could not find class: com.company.division.junit.EventTests
Exception in thread "main" java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.junit.runner.Computer.getSuite(Computer.java:28)
    at org.junit.runner.Request.classes(Request.java:75)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:117)
    at org.junit.runner.JUnitCore.runMain(JUnitCore.java:96)
    at org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:47)
    at org.junit.runner.JUnitCore.main(JUnitCore.java:40)
Caused by: java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 18 more

已编辑 - 新更新

所以从other threads 之一我发现了eclipse 使用什么命令来运行单元测试。 Eclipse 使用的是 javaw.exe,我用 java.exe 工具替换了 javaw。 这是命令,

C:\Java\64bit_Browser_Plugin\bin\java.exe -Dfile.encoding=Cp1252 -classpath C:\working_dir\bin;C:\working_dir\lib\mysql-connector-java-5.0.8-bin.jar;C:\working_dir\lib\ojdbc14.jar;C:\working_dir\lib\spring-beans-3.2.4.RELEASE.jar;C:\working_dir\lib\spring-context-3.2.4.RELEASE.jar;C:\working_dir\lib\spring-core-3.2.4.RELEASE.jar;C:\working_dir\lib\spring-expression-3.2.4.RELEASE.jar;C:\working_dir\lib\spring-jdbc-3.2.4.RELEASE.jar;C:\working_dir\lib\spring-tx-3.2.4.RELEASE.jar;C:\working_dir\lib\commons-logging-1.1.3.jar;C:\working_dir\lib\nzjdbc.jar;C:\working_dir\lib\junit.jar;C:\working_dir\lib\spring-batch-core-2.2.5.RELEASE.jar;C:\working_dir\lib\spring-batch-infrastructure-2.2.5.RELEASE.jar;C:\working_dir\lib\hamcrest-core-1.3.jar;C:\working_dir\lib\log4j-1.2.14.jar;C:\working_dir\lib\mail.jar;C:\working_dir\lib\spring-context-support-4.0.1.RELEASE.jar;/C:/eclipse/configuration/org.eclipse.osgi/bundles/167/1/.cp/;/C:/eclipse/configuration/org.eclipse.osgi/bundles/166/1/.cp/ org.eclipse.jdt.internal.junit.runner.RemoteTestRunner -version 3 -port 54536 -testLoaderClass org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader -loaderpluginname org.eclipse.jdt.junit4.runtime -classNames com.omnitracs.fra.junit.EventTests

我仍然遇到异常:

Could not connect to:  : 54536
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.connect(Remote
TestRunner.java:570)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTest
Runner.java:381)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTes
tRunner.java:197)

我错过了什么?

【问题讨论】:

【参考方案1】:

尝试在类路径中包含 hamcrest-core.jar。

https://github.com/junit-team/junit/wiki/Download-and-Install

【讨论】:

我仍然找不到类:com.company.division.junit.EventTests Time:0 OK (0 tests)【参考方案2】:

将目录更改为测试所在的位置是错误的。 java 程序将从你给它的类路径开始,并假设包目录结构从那里开始,所以如果你在C:\Sample\com\company\division\junit\ 并且你给 java 命令-cp = "." 那么它将寻找类com.company.division.junit.EventTestsC:\Sample\com\company\division\junit\com\company\division\junit\

此外,如果您没有在类路径中包含您的类(您的最后一个示例是唯一包含它们的示例),那么 java exe 将找不到它们。

您需要将当前目录添加到类路径中,首先更改目录以使包结构的顶部位于您的当前目录:

cd c:\Sample
java -cp ".;lib\*.jar" org.junit.runner.JUnitCore com.company.division.junit.EventTests 

这样. 指向你的包的定义位置。

如果您更愿意使用绝对路径,请尝试

java -cp "C:\Sample;C:\Sample\lib\*.jar" org.junit.runner.JUnitCore com.company.division.junit.EventTests 

您可以使用* 作为通配符来包含以 jdk 6 开头的多个 jar。

未来,考虑使用 Maven 中默认使用的目录布局。将测试与代码分开通常是一件好事。我想知道这个问题的一部分是否不是仅测试依赖项位于与其他库不同的位置。

在 Eclipse 中右键单击您的项目并找到菜单 Build Path -&gt; Configure Build Path,并确保您知道 Eclipse 从哪里获取这些 jar。

【讨论】:

仍然没有运气得到同样的错误。我将尝试设置一个 Maven。 @Ram 你遇到了什么错误?由于这在 Eclipse 中有效,因此您在本地拥有 jar,只需找到它们将它们添加到 java 类路径的位置即可。 JUnit 4.11 版找不到类:com.company.division.junit.EventTests 时间:0 OK(0 次测试) @Ram: 你执行了什么命令来得到这个?你试过我在这里添加的绝对路径版本吗? @Ram:你的课程写到哪里了?也许它们被写入与源不同的目录? (您可以通过查看 eclipse 中的配置构建路径的东西得到另一件事)

以上是关于从 DOS 命令行运行 JUnit 测试时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用命令行从 JUnit 类运行单个测试

如何使用 Gradle 和 JUnit 5 仅运行特定测试?

从 DOS 命令行关闭正在运行的应用程序

DOS中的特殊符号

JUnit

Junit单元测试