1. 程式人生 > >scala單元測試“NoSuchMethodError”的解決辦法

scala單元測試“NoSuchMethodError”的解決辦法

在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至少還得努力十年。取代?不可能!