SBT可以与jMockit一起使用吗?

时间:2014-06-25 19:54:18

标签: sbt jmockit

经过多次挣扎,我终于得到了一个从Maven转到SBT的大型项目。然而,剩下的问题之一是项目中的一些单元测试使用jMockit,在配置环境时可能有点高维护。

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

  1. jmockit jar必须出现在类路径之前 junit jar
  2. 在许多JVM上,例如我正在使用的OpenJDK,需要JVM参数-javaagent:<path/to/jmockit.jar>
  3. 如果不满足这两个条件,我将面临错误:

    [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选项?如何在启动测试时查看/验证实际使用的选项?

1 个答案:

答案 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)}"

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)}"