经过多次挣扎,我终于得到了一个从Maven转到SBT的大型项目。然而,剩下的问题之一是项目中的一些单元测试使用jMockit,在配置环境时可能有点高维护。
具体来说,jmockit
依赖/ jar有两个困难的要求:
-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)
我想我最终设法用SBT照顾#1,但我仍然遇到第二个问题。调试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>"
)
我认为基于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), ...)
所以我认为我的javaagent
设置没有预期的结果。
如果我碰巧让这个工作,我的下一个问题是如何从那里获得硬编码的jmockit.jar路径,但是现在我将接受通过测试用例。
那么,如何设置用于测试的JVM选项?如何在启动测试时查看/验证实际使用的选项?
答案 0 :(得分:4)
您需要将javaOptions
更改为javaOptions in Test
(请注意T
中的Test
是大写的。
您可以执行show test:javaOptions
> show test:javaOptions
[info] List(-javaagent:/home/lpiepiora/.ivy2/cache/com.googlecode.jmockit/jmockit/jars/jmockit-1.7.jar)
此外,如果您想使用 jmockit jar的动态路径,可以像这样设置javaOptions
:
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)}"
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)}"