Junit &引用;播放测试“;类路径与“类路径”不同;sbt测试“;类路径

Junit &引用;播放测试“;类路径与“类路径”不同;sbt测试“;类路径,junit,playframework,jenkins,playframework-2.0,sbt,Junit,Playframework,Jenkins,Playframework 2.0,Sbt,情况: 我想为我的游戏执行JUnit测试用例!Jenkins服务器上的2.0应用程序。 要在服务器上构建和测试我的应用程序,我想使用SBT(使用命令序列:clean compile test) 问题: 不管Jenkins是谁,命令play test使用的类路径与命令java-jar“sbt launch.jar”test不同(两个命令都在我的play项目的根目录中执行,两个命令都使用相同的sbt版本0.12.2)。我的测试用例可以使用playtest进行编译,但是使用java-jar“sbt l

情况: 我想为我的游戏执行JUnit测试用例!Jenkins服务器上的2.0应用程序。 要在服务器上构建和测试我的应用程序,我想使用SBT(使用命令序列:
clean compile test

问题: 不管Jenkins是谁,命令
play test
使用的类路径与命令
java-jar“sbt launch.jar”test
不同(两个命令都在我的play项目的根目录中执行,两个命令都使用相同的sbt版本0.12.2)。我的测试用例可以使用
playtest
进行编译,但是使用
java-jar“sbt launch.jar”test
编译器会抱怨缺少一些JUnit类(例如,
org.JUnit.rules.TestWatcher

分析: 命令
showtest:full classpath
显示类路径确实不同:

play test
classpath包含:
Attributed(\repository\local\junit\junit-dep\4.10\jars\junit-dep.jar)

java-jar”sbt-launch.jar测试
classpath包含:
Attributed(\.ivy2\cache\junit\junit-dep\jars\junit-dep-4.8.2.jar)

问题: 如何确保
java-jar“sbt-launch.jar test
使用与
play test
相同的类路径

Build.scala:

import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {

val appName         = "my app"
val appVersion      = "1.0-SNAPSHOT"

val appDependencies = Seq(
    // Play framework dependencies
    javaCore, javaJdbc, javaEbean,
    // Add your project dependencies here
    "com.typesafe" %% "play-plugins-mailer" % "2.1.0",
    "com.feth" %% "play-authenticate" % "0.2.5-SNAPSHOT",
    "org.mongodb" % "mongo-java-driver" % "2.10.1",
    "com.embedly" % "embedly-api" % "0.1.5",
    "org.mockito" % "mockito-all" % "1.9.5",
    "org.mongojack" % "mongojack" % "2.0.0-RC5",
    "commons-io" % "commons-io" % "2.3"
)

val main = play.Project(appName, appVersion, appDependencies).settings(
    resolvers += Resolver.url("play-easymail (release)", url("http://joscha.github.com/play-easymail/repo/releases/"))(Resolver.ivyStylePatterns),
    resolvers += Resolver.url("play-easymail (snapshot)", url("http://joscha.github.com/play-easymail/repo/snapshots/"))(Resolver.ivyStylePatterns),

    resolvers += Resolver.url("play-authenticate (release)", url("http://joscha.github.com/play-authenticate/repo/releases/"))(Resolver.ivyStylePatterns),
    resolvers += Resolver.url("play-authenticate (snapshot)", url("http://joscha.github.com/play-authenticate/repo/snapshots/"))(Resolver.ivyStylePatterns)
)
}

play
脚本将sbt重新布线,以使用本地JUnit文件存储库以及您使用过的任何远程存储库。这就是下载量如此之大的原因。默认情况下,Ivy不会将本地文件复制到其本地缓存中,因为它假定这些文件是稳定的

因此,您看到的是下载文件的sbt脚本,而Play脚本有自己的本地repo,优先于下载的文件

现在有趣的部分是版本控制。Ivy有有趣的版本冲突解决方案


如果在
target/resolution cache/reports
目录中进行粘贴查看,您可能会了解这两个命令之间的差异,以及为什么选择一个junit而不是另一个junit。我猜有一个动态版本范围在本地存储库中查找play脚本,但没有找到junit-dep的较新版本。

您能提供您的
build.sbt
build.scala
吗?你有junit依赖项吗?当然,贴在上面。其中一个依赖项需要JUnit4.8.2。但是,对于
playtest
JUnit4.10,优先考虑。