我在编写单元测试时遇到了一个有趣的问题,当我通过IDE(IntelliJ Idea)运行测试时,特定类型的Scala代码检查成功,而当我通过SBT运行测试时却失败了sbt test。有问题的代码就是这一行:
tag == typeTag[Unit]
Run Code Online (Sandbox Code Playgroud)
标签在这里是一个TypeTag[A]。因此检查是通过反射确定参数类型是否为Unit,仅此而已。我知道相等性检查存在缺陷,我应该使用Scala的反射API运算符,我已经将其重写了,现在它通过我的IDE和SBT都通过了测试:
tag.tpe =:= typeOf[Unit]
Run Code Online (Sandbox Code Playgroud)
我的问题不是如何解决问题(因为已经存在),而是为什么有缺陷的检查在通过我的IDE运行时总是会成功,而在通过SBT运行时总是会失败,这两个操作之间的不同会导致这种差异?
(某些版本信息:我在代码中使用的是JRE 11.0.2,Scala 2.12和SBT 1.2.8。编辑:如下所述,它也发生在Java 8上)
编辑:根据要求,我的编译器设置。原谅审查,我宁愿小心公司的细节。

还有我在build.sbt中使用的scalacOptions,编译器插件和测试标志:
val scalacOpts = Seq(
"-Ywarn-unused:implicits",
"-Ywarn-unused:imports",
"-Ywarn-unused:locals",
"-Ywarn-unused:params",
"-Ywarn-unused:patvars",
"-Ywarn-unused:privates",
"-Ypartial-unification",
"-deprecation",
"-encoding", "UTF-8",
"-feature",
"-language:existentials",
"-language:higherKinds",
"-language:implicitConversions",
"-unchecked",
"-Xlint",
"-Yno-adapted-args",
"-Ywarn-dead-code",
"-Ywarn-numeric-widen",
"-Ywarn-value-discard",
"-Xfuture"
)
addCompilerPlugin("org.spire-math" %% "kind-projector" % "0.9.9")
addCompilerPlugin("com.olegpy" %% "better-monadic-for" % "0.3.0")
testFrameworks += new TestFramework("org.scalameter.ScalaMeterFramework")
logBuffered := false
parallelExecution in Test := false
Run Code Online (Sandbox Code Playgroud)