Sbt 1.1.5项目中使用PowerMock遇编译错误求助
解决Sbt项目中PowerMock找不到PowerMockRunner的问题
我来帮你搞定这个在Sbt项目里用PowerMock模拟静态方法时遇到的编译错误问题。
问题原因
你当前的依赖配置里缺少了PowerMock的JUnit4核心模块,PowerMockRunner类正是在这个模块中定义的,所以编译器找不到它。另外,你用的Mockito版本是2.x,但依赖里用的是适配Mockito 1.x的powermock-api-mockito,这也可能埋下版本兼容的隐患。
具体解决步骤
1. 更新build.sbt的依赖配置
修改你的依赖列表,添加powermock-module-junit4,并把powermock-api-mockito替换为适配Mockito 2.x的powermock-api-mockito2:
scalaVersion := "2.11.7" libraryDependencies ++= Seq( // 保留你原有的其他依赖 "org.mockito" % "mockito-core" % "2.18.3" % "test", // 替换为适配Mockito 2.x的API "org.powermock" % "powermock-api-mockito2" % "1.7.4" % "test", // 新增这个依赖,提供PowerMockRunner类 "org.powermock" % "powermock-module-junit4" % "1.7.4" % "test", "org.powermock" % "powermock-module-javaagent" % "1.7.4" % "test", "org.powermock" % "powermock-module-junit4-rule-agent" % "1.7.4" % "test" )
2. 配置Sbt测试的JavaAgent
PowerMock需要借助JavaAgent来修改字节码,才能实现静态方法的Mock。在build.sbt中添加以下配置,让Sbt自动把PowerMock的JavaAgent加入测试的JVM参数:
Test / javaOptions += "-javaagent:" + (Test / dependencyClasspath).value .find(_.data.getName.contains("powermock-module-javaagent")) .map(_.data.getAbsolutePath) .getOrElse("")
3. 验证测试类代码
确认你的测试类中的导入和注解保持不变即可,现在依赖补全后,编译器应该能正常识别PowerMockRunner了:
import org.powermock.modules.junit4.PowerMockRunner import org.junit.runner.RunWith @RunWith(classOf[PowerMockRunner]) class MyClassSpec { // 你的测试代码 }
做完这些修改后,重新执行sbt test,应该就能正常编译并运行测试了。
内容的提问来源于stack exchange,提问作者syuhei
相关产品推荐
相关产品推荐

