【发布时间】: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 没有显示任何具有此类名称的方法:/