scala單元測試“NoSuchMethodError”的解決辦法
阿新 • • 發佈:2018-12-25
在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>
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至少還得努力十年。取代?不可能!