使用ScalaTest测试Scala项目时编译报错的原因排查
问题描述
我在IntelliJ中通过SBT搭建了一个新的Scala项目,编写了以下基础类:
Person.scala
package learning.functional case class Person( name: String )
Main.scala
package learning.functional import learning.functional.person object Main{ val p = Person("John") }
PersonTest.scala
import learning.functional.Person import org.scalatest.FunSuite class PersonTest extends FunSuite { test("test person") { val p = Person("John") assert(p.name == "John") } }
运行sbt test时抛出如下错误:
## Exception when compiling 1 sources to /Users/johndooley/Desktop/Scala/scala-learning/target/scala-2.13/test-classes [error] java.lang.AssertionError: assertion failed: [error] unexpected value engine in trait FunSuite final <expandedname> private[this] [error] while compiling: /Users/johndooley/Desktop/Scala/scala-learning/src/test/scala/PersonTest.scala
我的build.sbt文件内容如下:
ThisBuild / scalaVersion := "2.13.10" libraryDependencies += "org.scalatest" % "scalatest_2.10" % "1.9.1" lazy val root = (project in file(".")) .settings( name := "scala-learning" )
我已尝试清理缓存重启、执行clean、update、compile操作,但均无效,请问该问题的原因是什么?
问题原因与解决方案
核心问题是Scala版本与ScalaTest版本完全不兼容:
- 你使用的Scala版本是2.13.10,但依赖的ScalaTest是针对Scala 2.10的
scalatest_2.10,且1.9.1是非常老旧的版本,完全不支持Scala 2.13系列。
修复步骤:
- 修改
build.sbt中的ScalaTest依赖,使用适配Scala 2.13的3.x版本:
ThisBuild / scalaVersion := "2.13.10" libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % Test lazy val root = (project in file(".")) .settings( name := "scala-learning" )
- 用
%%替代%,它会自动匹配当前项目的Scala版本,无需手动写_2.13后缀; - 添加
% Test标识,让该依赖仅在测试阶段生效,避免污染主代码依赖。
- 顺便修正
Main.scala中的小错误:
package learning.functional // 原代码导入的小写person是错误的,同包下可直接省略导入 object Main{ val p = Person("John") }
修改完成后,重新执行sbt test即可正常运行测试。
内容的提问来源于stack exchange,提问作者megadarkfriend
相关产品推荐
相关产品推荐

