为什么Scala + Intellij + ScalaTest + Scalactic中的"无法找到隐式"错误,而不是来自sbt

ang*_*era 14 scala intellij-idea scalatest scalactic

我有这个代码100%来自sbt,执行sbt test但在Intellij Idea中抛出一个编译错误.

import org.scalatest.{BeforeAndAfter, FunSuite, GivenWhenThen}

class SimpleTest extends FunSuite with GivenWhenThen with BeforeAndAfter {
  test("Simple Test") {
    Given("Why this error?")
    assert("ok" === "ok")
  }
}
Run Code Online (Sandbox Code Playgroud)

错误是:

Error:(5, 10) could not find implicit value for parameter pos: org.scalactic.source.Position
    Given("Why this error?")
Error:(5, 10) not enough arguments for method Given: (implicit pos: org.scalactic.source.Position)Unit.
Unspecified value parameter pos.
    Given("Why this error?")
Error:(6, 11) could not find implicit value for parameter prettifier: org.scalactic.Prettifier
    assert("ok" === "ok")
Error:(6, 11) macro applications do not support named and/or default arguments
    assert("ok" === "ok")
Error:(6, 11) not enough arguments for macro method assert: (implicit prettifier: org.scalactic.Prettifier, implicit pos: org.scalactic.source.Position)org.scalatest.Assertion.
Unspecified value parameters prettifier, pos.
    assert("ok" === "ok")
Error:(4, 23) could not find implicit value for parameter pos: org.scalactic.source.Position
  test("Simple Test") {
Run Code Online (Sandbox Code Playgroud)

按照建议刷新并重新加载后:

Error:(6, 11) exception during macro expansion: 
java.lang.NoSuchMethodError: org.scalactic.BooleanMacro.genMacro(Lscala/reflect/api/Exprs$Expr;Ljava/lang/String;Lscala/reflect/api/Exprs$Expr;)Lscala/reflect/api/Exprs$Expr;
    at org.scalatest.AssertionsMacro$.assert(AssertionsMacro.scala:34)
    assert("ok" === "ok")
Run Code Online (Sandbox Code Playgroud)

我在用:

IntelliJ IDEA 2016.3.2
Build #IU-163.10154.41, built on December 21, 2016

scalaVersion := "2.11.0",
"org.scalactic" %% "scalactic" % "3.0.1" % "test",
"org.scalatest" %% "scalatest" % "3.0.1" % "test"
Run Code Online (Sandbox Code Playgroud)

注意: - 使用File -> Invalidate Caches / Restart不能解决问题 - 重现错误的示例:Github中的示例

ang*_*era 11

响应底部的变通方法.;)

此问题与此BUG列表有关:

问题是项目中存在依赖关系,使用测试范围,其他版本的scalatest和scalactic.

IntelliJ Idea混合编译范围和测试范围,但SBT正常工作.IntelliJ Idea团队在BUG中表示他们正在为此工作.

目前,我的解决方法已经转移到其他库用于测试的旧版本.

笔记:

@ justin-kaeser被分配并正在努力解决这个问题.谢谢!

在最新的预览中,Scala插件有很多改进.

重现错误的示例:https://github.com/angelcervera/idea-dependencies-bug

几点解决方法:

  1. 从项目结构 - >模块中删除有问题的依赖项
  2. 在sbt中排除库.
  3. 使用相同的版本.
  4. 尝试使用最后一个EAP:https://www.jetbrains.com/idea/nextversion/


Jus*_*ser 8

有些依赖项可能在编译范围内包含不兼容的Scalactic或Scalatest版本,这些版本也包含在测试范围内.

您可以在Project Settings/Modules/Dependencies选项卡下的Project Structure中进行检查,并使用sbt-dependency-graph插件更仔细地分析它.

但是,SBT会执行IntelliJ不会(发布)的依赖性驱逐,这会在从IDE进行编译时导致其他问题.如果sbt-dependency-graph显示冲突的版本被逐出,那么它可能就是这个问题的一个实例.

解决方法:当您发现有问题的传递依赖项时,请将其从build.sbt中的根依赖项中排除.例如:

"org.apache.spark" %% "spark-core" % "2.1.0" % "provided" exclude("org.scalatest", "scalatest_2.11")
Run Code Online (Sandbox Code Playgroud)