PowerMock没有ScalaTest
支持,所以我尝试使用JUnit来运行我的ScalaTest类,使用@RunWith[classOf[JUnitRunner]]
。使用 Maven,您可以将 javaagent 模块配置为急切加载以支持此功能,如 PowerMock wiki 中所述。我需要在 SBT 中做什么才能获得相同的结果?
name := "my-project"
version := "1.0"
scalaVersion := "2.10.2"
libraryDependencies ++= Seq(
// ... other dependencies above ...
"org.powermock" % "powermock-api-mockito" % "1.5.1" % "test",
"org.powermock" % "powermock-module-javaagent" % "1.5.1" % "test",
"org.powermock" % "powermock-module-junit4-rule-agent" % "1.5.1" % "test",
"com.novocode" % "junit-interface" % "0.10" % "test->default"
)
如图所示,此项目存在错误:
[error] Caused by: java.lang.IllegalStateException: PowerMockRule can only be used with the system classloader but was loaded by sbt.classpath.ClasspathUtilities$$anon$1@1cee593
[error] at org.powermock.modules.junit4.rule.PowerMockRule.<clinit>(PowerMockRule.java:28)
[error] ... 55 more
看起来SBT有自己的类加载器来运行与PowerMock需要做的冲突的测试。
使用 SBT 0.12.4,将以下内容添加到您的build.sbt
fork in Test := true
javaOptions in Test <+= managedClasspath in Test map { (cp: Classpath) =>
val agentJar = cp.find(_.data.name.contains("powermock-module-javaagent")).get
"-javaagent:" + agentJar.data
}
这会导致 SBT 创建一个新的 JVM 进程来运行测试,并添加正确的 JVM 命令行参数来预加载 javaagent 模块。