web-dev-qa-db-ja.com

Scala + Intellij + ScalaTest + Scalacticで「暗黙の」エラーを見つけることができなかったが、sbtからではない理由

このコードはsbtから100%動作し、sbt testを実行していますが、IntellijIdeaでコンパイルエラーをスローします。

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

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

エラーは次のとおりです。

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") {

提案どおりに更新してリロードした後:

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")

使ってます:

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"

注:-File -> Invalidate Caches / Restartを使用しても問題は解決しません-エラーを再現する例: Githubの例

14
angelcervera

応答の下部にある回避策。 ;)

この問題は、このバグのリストに関連しています。

問題は、テストスコープを使用して、他のバージョンの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/
11
angelcervera

一部の依存関係は、互換性のないバージョンのScalacticまたはScalatestをコンパイルスコープに一時的に含めている可能性があります。これらもテストスコープに含まれています。

これは、[プロジェクト設定]/[モジュール]/[依存関係]タブの[プロジェクト構造]で確認し、 sbt-dependency-graph プラグインを使用してより詳細に分析できます。

ただし、SBTは、IntelliJが実行しない依存関係の削除を実行します( issue )。これにより、IDEからコンパイルするときに追加の問題が発生する可能性があります。 sbt-dependency-graphが、競合するバージョンが削除されたことを示している場合、それはおそらくこの問題のインスタンスです。

回避策:問題のある推移的な依存関係を見つけたら、build.sbtのルート依存関係から除外します。例えば:

"org.Apache.spark" %% "spark-core" % "2.1.0" % "provided" exclude("org.scalatest", "scalatest_2.11")
8
Justin Kaeser

これがIDEのバグであるかどうかはわかりませんが、私にとってはIDEを最新のものにアップグレードしても、役に立たないことがわかりました。ここで数時間を無駄にした後このエラーを解決するための私のアプローチです。

could not find implicit value for parameter prettifier: org.scalactic.Prettifier

解決 :

In IntelliJ press Ctrl+Alt+Shift+S -> Modules -> Dependencies -> Search for 
org.scalactic:3.0.0.jar (Test scope) and most probably there would be 
another version as 2.x.x in compile scope. Right click on 2.x.x and select 
EDIT and then choose the 3.0.0 version in compile scope, and apply new 
settings.

P.S. Depending on your case there may be only one entry but make sure you 
use 3.0.0 in compile scope to get rid of that weird error.
2
Gaurav MK

issue 17 で述べたように、spark-testing-baseの依存関係の取り違えで問題になる可能性があります。

依存関係を混在させていないことを確認してください

私は次の依存関係を持っていました

_libraryDependencies ++= Seq(
  "org.Apache.spark" % "spark-core_2.11" % "2.1.0",
  "org.Apache.spark" % "spark-sql_2.11" % "2.1.0",
  "org.Apache.spark" % "spark-streaming_2.11" % "2.1.0",
  "org.Apache.spark" % "spark-mllib_2.11" % "2.1.0",
  "com.holdenkarau" %% "spark-testing-base" % "2.1.0_0.8.0" % "test",
  "org.scalatest" % "scalatest_2.11" % "2.1.0" % "test",
  "edu.stanford.nlp" % "stanford-corenlp" % "3.8.0",
  "edu.stanford.nlp" % "stanford-corenlp" % "3.8.0" classifier "models"
)
_

そして、私がテストクラスを実行しようとしたとき、私は得ていました

Error:(32, 14) could not find implicit value for parameter pos: org.scalactic.source.Position test("lsi"){ Error:(32, 14) not enough arguments for method test: (implicit pos: org.scalactic.source.Position)Unit. Unspecified value parameter pos. test("lsi"){ ..........

次に、依存関係をに変更します

_libraryDependencies ++= Seq(
  "org.Apache.spark" % "spark-core_2.11" % "2.2.0",
  "org.Apache.spark" % "spark-sql_2.11" % "2.2.0",
  "org.Apache.spark" % "spark-streaming_2.11" % "2.2.0",
  "org.Apache.spark" % "spark-mllib_2.11" % "2.2.0",
  "com.holdenkarau" %% "spark-testing-base" % "2.2.0_0.8.0" % "test",
  "org.scalatest" % "scalatest_2.11" % "2.2.2" % "test",
  "edu.stanford.nlp" % "stanford-corenlp" % "3.8.0",
  "edu.stanford.nlp" % "stanford-corenlp" % "3.8.0" classifier "models"
)
_

プロジェクトを再インポートしましたクリーンでパッケージが機能しなかったため

そして、テストクラスに合格しました。

0
Ramesh Maharjan

同様の問題がありました。

私にとって、これを解決する最も簡単な方法は、.ideaフォルダーを削除してプロジェクトを再インポートすることでした。

0
Teimuraz

また、プロジェクトのJDKがJDK 8に設定されていることを確認してください。 Scalaは、現在IntelliJのデフォルトであるJDK11と互換性がありません。

同じことがMavenでも起こりました。

私はすべてがうまくいくプロジェクトを持っていました。最新のIntelliJアップグレード後、JDK設定を忘れました。私は答えのすべてのステップを実行しましたが、どれも役に立ちませんでした。最後の手段として、IntelliJを最初から再インストールし、クリーンなリポジトリ(.ideaフォルダーまたは.imlファイルなし)をチェックアウトしましたが、...役に立ちませんでした。その後、プロジェクトを再度セットアップしているときに、JDK 11に気づきました。ベルが鳴り、JDK 8が追加され、そこに行きます。テストは再び緑色になります。

0
István