junit - "play test"类路径不同于 "sbt test"类路径

标签 junit playframework jenkins playframework-2.0 sbt

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

问题:
不管Jenkins,命令play test使用与命令 java -jar "sbt-launch.jar" test 不同的类路径(两个命令都在我的 Play 项目的根目录下执行,两个命令使用相同的 sbt 版本 0.12.2)。我的测试用例可以用 play test 编译但与 java -jar "sbt-launch.jar" test编译器提示缺少一些 JUnit 类(例如, org.junit.rules.TestWatcher )。

分析:
命令 show test:full-classpath表明类路径确实不同:
play test类路径包含:Attributed(<playhome>\repository\local\junit\junit-dep\4.10\jars\junit-dep.jar)java -jar "sbt-launch.jar test类路径包含:Attributed(<userhome>\.ivy2\cache\junit\junit-dep\jars\junit-dep-4.8.2.jar)
题:
任何想法如何确保java -jar "sbt-launch.jar test使用与 play test 相同的类路径?

构建.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 脚本,该存储库优先于下载的文件。

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

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

关于junit - "play test"类路径不同于 "sbt test"类路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17966515/

相关文章:

docker - 无法在Jenkins中运行Groovy sh命令

Jenkins 常规安全警告设置

java - 在运行多个单元测试之前需要设置对象

java.lang.AssertionError : Status expected:<200> but was:<404> for Spring Boot Rest Controller

scala - 如何使用 Anorm 将 Row 映射到类?

java - 查找两个节点之间的路径,而不提及要迭代的循环次数

jenkins - 在 Jenkins Pipeline 中使用全局变量

unit-testing - 是否有与 NUnit 的 testcase 属性等效的 JUnit?

java - 覆盖对象的 toString() 表示返回意外的符号

playframework - 如何将Play Framework 2.0应用程序作为Windows服务运行?