在scala 2.12.3版本的单元测试中,严格按照ScalaTest的安装步骤,结果在运行单元测试时,提示如下错误:
java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps;
at org.scalatest.tools.ArgsParser$.checkArgsForValidity(ArgsParser.scala:37)
at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:857)
at org.scalatest.tools.Runner$.run(Runner.scala:850)
at org.scalatest.tools.Runner.run(Runner.scala)
at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:138)
at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:28)
解决办法如下:
1. 首先将scalatest的版本调整到scala现有版本一模一样,精确到小数点后两位,如2.12,现在POM中的内容如下:
<dependency>
<groupId>org.scalatest</groupId>
<artifactId>scalatest_2.12</artifactId>
<version>3.0.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.scalactic</groupId>
<artifactId>scalactic_2.12</artifactId>
<version>3.0.4</version>
</dependency>
- 其次将测试的格式调整为照ScalaTest的推荐格式,如下:
import org.scalatest.FunSuite
import org.scalatest.FlatSpec
class MiranaTest extends FunSuite {
test("An empty Set should have size 0") {
assert(Set.empty.size == 0)
}
test("Invoking head on an empty Set should produce NoSuchElementException") {
assertThrows[NoSuchElementException] {
Set.empty.head
}
}
}
这里再说一个技巧,如果想更新第三方架包的最新版本,但又不想花太多的时间查找正确的版本与组ID,可以到MAVEN仓库上进行查找,可以得到最完整的MAVEN依赖信息。
结论
scala语言的向后兼容性真是弱爆了,一个小版本竟然都导致这么多不兼容,跟JAVA相比,那可真是分分钟被吊打的节奏,有人说scala有可能会取代JAVA,就凭这一点,我就敢断定,在企业应用中最关注的稳定性与持续性方面,scala至少还得努力十年。取代?不可能!