SBT 可以与 jMockit 一起使用吗?

goo*_*lie 3 jmockit sbt

经过多次努力,我终于将一个大项目从 Maven 转换为 SBT。然而,剩下的问题之一是项目中的一些单元测试使用 jMockit,这在配置环境时可能有点难以维护。

具体来说,jmockitdependency/jar 有两个困难的要求:

  1. jmockit jar 必须出现在类路径中的junit jar之前
  2. 在许多 JVM 上,例如我正在使用的 OpenJDK,JVM 参数-javaagent:<path/to/jmockit.jar>是必需的

如果这两个条件都不满足,我将面临错误:

[error] Test <mytestclass>.initializationError failed: java.lang.Exception: Method <mytestmethod> should have no parameters
[error]     at mockit.integration.junit4.JMockit.<init>(JMockit.java:32)
Run Code Online (Sandbox Code Playgroud)

我想我最终成功地用 SBT 解决了第一个问题,但第二个问题我仍然遇到了麻烦。调试 SBT 日志没有显示有关分叉进程调用的足够详细信息,无法告诉我我的设置是否有效。但测试输出始终表明它不起作用。我有我认为的所有相关设置:

lazy val myproj = Project(
    ...
    settings = otherSettings ++ Seq(
        libraryDependencies ++= Seq(
                 "com.googlecode.jmockit" % "jmockit" % "1.7" % "test",
                 "junit" % "junit" % "4.8.1" % "test"
        ),
        fork in Test := true,
        javaOptions in test += "-javaagent:<hardcode-path-to-jmockit.jar>"
    )
Run Code Online (Sandbox Code Playgroud)

根据以下输出,我认为类路径没问题test:dependencyClasspath

sbt> project <myproject>
sbt> show test:dependencyClasspath
[info] List(...., Attributed(/var/build/ivy2/cache/junit/junit/jars/junit-4.8.1.jar), ...
..., Attributed(/var/build/ivy2/cache/com.googlecode.jmockit/jmockit/jars/jmockit-1.7.jar), ...)
Run Code Online (Sandbox Code Playgroud)

所以我认为我的javaagent设置没有达到预期的结果。

如果我碰巧让它工作,我的下一个问题是如何从那里获取硬编码的 jmockit.jar 路径,但现在我将满足于通过测试用例。

那么,如何设置用于测试的 JVM 选项呢?启动测试时如何查看/验证实际使用了哪些选项?

lpi*_*ora 5

您需要将您的更改javaOptionsjavaOptions in Test(注意TinTest是大写的)。

您可以通过执行来检查您的选项show test:javaOptions

> show test:javaOptions
[info] List(-javaagent:/home/lpiepiora/.ivy2/cache/com.googlecode.jmockit/jmockit/jars/jmockit-1.7.jar)
Run Code Online (Sandbox Code Playgroud)

另外,如果你想使用jmockitjavaOptions jar 的动态路径,你可以这样设置:

def jmockitPath(f: Seq[File]) = f.filter(_.name.endsWith("jmockit-1.7.jar")).head

javaOptions in Test += s"-javaagent:${jmockitPath((dependencyClasspath in Test).value.files)}"
Run Code Online (Sandbox Code Playgroud)

build.sbt供参考

libraryDependencies += "com.novocode" % "junit-interface" % "0.9" % "test"

libraryDependencies ++= Seq(
  "com.googlecode.jmockit" % "jmockit" % "1.7" % "test",
  "junit" % "junit" % "4.8.1" % "test"
)

fork in Test := true

def jmockitPath(f: Seq[File]) = f.filter(_.name.endsWith("jmockit-1.7.jar")).head

javaOptions in Test += s"-javaagent:${jmockitPath((dependencyClasspath in Test).value.files)}"
Run Code Online (Sandbox Code Playgroud)