【问题标题】:NoSuchMethodError: java.lang.String.lines()Ljava/util/stream/Stream; when trying to run a test with ScalaMockNoSuchMethodError: java.lang.String.lines()Ljava/util/stream/Stream;尝试使用 ScalaMock 运行测试时
【发布时间】:2019-12-14 06:35:05
【问题描述】:

我正在使用 ScalaTest 和 ScalaMock,但我遇到了一个异常,导致我的测试甚至无法运行。

An exception or error caused a run to abort:
java.lang.String.lines()Ljava/util/stream/Stream;

我正在使用 Scala 2.13、JDK 8 和最新版本的框架:ScalaTest 3.0.8 和 ScalaMock 4.3.0。

我对 mocking 框架的使用是这样的:

import org.scalamock.scalatest.MockFactory

class AcceptanceTest extends MockFactory {
  val tokenHandler = mock[TokenHandler]
  tokenHandler.verify()
}

我没有显式调用lines() 方法,也没有发现verify() 调用了它。只有当我调用verify() 时才会出现问题。

这是错误的堆栈跟踪:

java.lang.NoSuchMethodError: java.lang.String.lines()Ljava/util/stream/Stream;
    at org.scalamock.handlers.Handlers$$anonfun$toString$1.apply(Handlers.scala:35)
    at org.scalamock.handlers.Handlers$$anonfun$toString$1.apply(Handlers.scala:34)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.immutable.List.foreach(List.scala:392)
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
    at scala.collection.mutable.ListBuffer.foreach(ListBuffer.scala:45)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
    at scala.collection.AbstractTraversable.map(Traversable.scala:104)
    at org.scalamock.handlers.Handlers.toString(Handlers.scala:34)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at scala.StringContext.standardInterpolator(StringContext.scala:125)
    at scala.StringContext.s(StringContext.scala:95)
    at org.scalamock.context.MockContext$class.errorContext(MockContext.scala:48)
...
    at org.scalatest.tools.SuiteRunner.run(SuiteRunner.scala:45)
    at org.scalatest.tools.Runner$$anonfun$doRunRunRunDaDoRunRun$1.apply(Runner.scala:1349)
    at org.scalatest.tools.Runner$$anonfun$doRunRunRunDaDoRunRun$1.apply(Runner.scala:1343)
    at scala.collection.immutable.List.foreach(List.scala:392)
    at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1343)
    at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1012)
    at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1011)
    at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1509)
    at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1011)
    at org.scalatest.tools.Runner$.run(Runner.scala:850)
    at org.scalatest.tools.Runner.run(Runner.scala)

知道如何摆脱它吗?

【问题讨论】:

  • 你在 TokenHandler 中有一个叫做lines的方法吗?
  • 这看起来像是在 JDK 11 上编译代码然后在 JDK 8 上运行编译代码的症状。在 JDK 11 中,java.lang.String 有一个 lines 方法,但在 JDK 8 上它没有t.
  • @PedroCorreiaLuís 不,没有方法称为 lines。在某些时候,我的方法verify() 确实调用了第三方库java-jwt,但即使在那里我也找不到对lines 的任何调用...
  • 验证是您的方法吗?因为ScalaMock也有一个叫verify的方法,可能是你调用了错误的方法。
  • @SethTisue 我通过指定适当的 JDK 版本 (8) 在我的机器和 Travis 中运行我的代码。这可能是一种解释,但我不知道这是怎么发生的:/ @PedroCorreiaLuí 是的,verify 是我的一种方法。我还尝试从同一个类中调用另一种方法,即verifyToMap,并得到了同样的错误。 ScalaMock 的 ScalaDoc 没有显示任何具有此类名称的方法:/

标签: scala scalatest scalamock


【解决方案1】:

问题在于 JDK 11 有一个具有相同签名的方法,该方法优先于某些隐式方法。您能否尝试使用快照版本为您解决此问题?很高兴尽快放弃另一个版本。 请参阅如何将 Sonatype 添加为解析器:https://scalamock.org/user-guide/installation/ 请尝试 4.4.0-SNAPSHOT

【讨论】:

  • 它与 ScalaMock 版本 4.4.0-SNAPSHOT 一起正常工作。谢谢!
  • 太棒了。我将在本周末正式发布 4.4.0,感谢您对其进行测试:)
  • 将 4.4.0 推送到 maven Central。现在正在同步
【解决方案2】:

这是 ScalaMock 本身的一个错误。错误报告在https://github.com/paulbutcher/ScalaMock/issues/268

该错误已得到修复,但截至今天(2019 年 8 月 8 日),还没有包含该修复的新版本。

【讨论】:

    猜你喜欢
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2019-05-13
    • 2022-06-23
    相关资源
    最近更新 更多