Может ли SBT работать с jMockit?

После долгих мучений я наконец получил большой проект, переведенный с Maven на SBT. Одна из оставшихся проблем, однако, заключается в том, что некоторые из модульных тестов в проекте используют jMockit, который может быть немного сложным, когда дело доходит до настройки среды.

В частности, зависимость/jar jmockit имеет два сложных требования:

  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)

Я думаю, что в конце концов мне удалось позаботиться о № 1 с помощью 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>"
    )

Я думаю, что путь к классам в порядке, основываясь на выводе 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, используемые для тестирования? Как просмотреть/проверить, какие параметры фактически используются при запуске тестов?


person goolie    schedule 25.06.2014    source источник


Ответы (1)


Вам нужно изменить 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, вы можете установить свой 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)}"
person lpiepiora    schedule 25.06.2014