Scala 2.11 - > 2.12 - 单元测试在sbt中失败,适用于IntelliJ

时间:2018-01-31 20:36:25

标签: java scala unit-testing intellij-idea

我有一个在Scala 2.11下工作的项目,我正在升级它以使用Scala 2.12。当我通过命令行在sbt上运行它时,我的单元测试失败了,但是当我通过IntelliJ IDEA运行它时,它运行正常。

我得到的错误是:

java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V

测试是Java中的JUnit测试,它调用用Scala编写的代码。

单元测试中的违规行:

String paramsJson = adapter.sendReadyMessage();

sendReadyMessage方法(也是Java)尝试创建ReadyMessage

ReadyMessage rm = new ReadyMessage(timestamp);

ReadyMessage只是一个Scala案例类

case class ReadyMessage(Timestamp: String) extends ToJson

ToJson是一个提升JSON帮助特征,它封装了JSON生成:

import net.liftweb.json.{DefaultFormats, Serialization}

trait ToJson {
  private implicit val formats = DefaultFormats
  def toJson = Serialization.write(this)
}

错误似乎发生在case class ReadyMessage行。 ToJson块用于上下文。

就像我说的那样,当我从IntelliJ中运行它时,它会起作用。我在sbt下运行时失败了。当它是sbt中的整批测试的一部分时失败,并且当我在sbt中自己运行它时失败。

如果没有粘贴我的整个build.sbt文件,我不确定此处包含哪些其他可能有用的信息。这似乎是某种版本冲突,但我经历并更新了我能找到的所有软件版本号。

我意识到这个问题涉及的问题可能比通过SO合理调试更复杂。但即使是“确保你在build.sbt中更新了XX”的回复也是有帮助的。

1 个答案:

答案 0 :(得分:2)

答案结果与问题本身一样烦人。

经过几个小时的搜索我的构建后,我意识到子项目中有一个“lib”目录失败了。我打开它,果然,它包含旧版本的Scala和其他一些库。我删除了那些,确保libraryDependencies处理它们,现在一切都构建和测试就好了。

感谢大家让我加入“这是Scala版本不匹配”的列车。孩子们,这是一个警示故事。根据自己的风险混合托管和非托管依赖项。