scala单元测试“NoSuchMethodError”的解决办法

在使用Scala 2.12.3进行单元测试时遇到`NoSuchMethodError`,解决方案包括:确保ScalaTest版本与Scala版本完全匹配,更新到与Scala版本一致的小数点后两位;并按照ScalaTest推荐格式编写测试代码。通过Maven仓库可快速查找和更新第三方库。尽管如此,Scala的向后兼容性问题仍显不足,与Java相比在稳定性上存在差距,短期内难以在企业应用中取代Java。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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>
  1. 其次将测试的格式调整为照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至少还得努力十年。取代?不可能!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值