39

今日、Intellij で簡単な TestKit テストを実行する際に問題が発生しました。テストは Scala コード用で (私は Intellij 用の Scala プラグインを持っています)、 Ray Roestenburg の exampleに基づいています。

Intellij プロジェクトは、「Maven モジュール」を使用して作成され、すべての依存関係を追加してプロジェクトを作成しました。テストは次の場所にあります。

ActorBlast/src/test/scala/basicTest.scala

私は基本的に、テストを「右クリック」して「実行」を選択しています。私が得るのは次のエラーです:

"C:\Program Files\Java\jdk1.7.0_25\bin\java" -Didea.launcher.port=7540... 午後 2:29 にテストを開始しました... Suite クラスをロードできません。これは、実行パスのエラーが原因である可能性があります。

欠落しているクラス: BasicActorSpec java.lang.ClassNotFoundException: BasicActorSpec at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController. doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java: 308) で java.lang.ClassLoader.loadClass(ClassLoader.java:357) で org.scalatest.tools.Runner$$anonfun$35.apply(Runner.scala:2393) で org.scalatest.tools.Runner$$anonfun$35 .apply(Runner.scala:2391) で scala.collection.TraversableLike$$anonfun$filter$1.apply(TraversableLike.scala:264) で scala.collection.immutable.List.foreach(List.scala:318) で scala.コレクション。TraversableLike$class.filter(TraversableLike.scala:263) at scala.collection.AbstractTraversable.filter(Traversable.scala:105) org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:2391) at org.scalatest. tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1006) at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1005) at org.scalatest.tools.Runner$ .withClassLoaderAndDispatchReporter(Runner.scala:2659) at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1005) at org.scalatest.tools.Runner$.run(Runner.scala:845) at org.scalatest. tools.Runner.run(Runner.scala) at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:144) at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:35) の sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブ メソッド) の sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) の sun.reflect.DelegatingMethodAccessorImpl. com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) で java.lang.reflect.Method.invoke(Method.java:606) で呼び出し (DelegatingMethodAccessorImpl.java:43)execution.application.AppMain.main(AppMain.java:120)execution.application.AppMain.main(AppMain.java:120)

プロセスは終了コード 0 で終了しました

これが何を意味するのか理解できません。私は多くの検索を行いましたが、答えが見つからないようです。ランナーが見つからないことについて不平を言っているクラスは、私がテスト/実行しようとしているクラスであることに注意してください。basicTest.scala は次のようになります。

// Testing specific imports
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
import org.scalatest.{ShouldMatchers, WordSpecLike, BeforeAndAfterAll}
import akka.testkit.{TestKit, DefaultTimeout, ImplicitSender}
// Actor specific imports
import akka.actor.{ActorRef, Actor, ActorSystem, Props}
// Misc. needed imports
import scala.concurrent.duration._
import com.typesafe.config.ConfigFactory


// In order to run tests in this module you need to use JUnitRunner (as per scalatest.org)
@RunWith(classOf[JUnitRunner])
class BasicActorSpec extends TestKit(ActorSystem("BasicActorSpec", ConfigFactory.parseString(BasicActorSpec.config)))
  with DefaultTimeout with ImplicitSender with WordSpecLike with ShouldMatchers with BeforeAndAfterAll {

  import BasicActorSpec._

  val echoRef = system.actorOf(Props[EchoActor])
  val forwardRef = system.actorOf(Props[ForwardActor])

  override def afterAll {
    shutdown(system)
  }


  /**
   * The actual tests...
   */
  "An EchoActor" should {
    "Respond with the same message it receives" in {
      within(500 millis) {
        echoRef ! "test"
        expectMsg("test")
      }
    }
  }

  "A Forwarding Actor" should {
    "Forward a message it receives" in {
      within(500 millis) {
        forwardRef ! "test"
        expectMsg("test")
      }
    }
  }

}

/**
 * Companion object of test class
 */
object BasicActorSpec {

  val config =
    """
      |akka {
      | loglevel = "Warning"
      |}
    """.stripMargin

  /**
   * Classes of Actors used in testing
   */
  class EchoActor extends Actor {
    def receive = {
      case msg => sender ! msg
    }
  }

  class ForwardActor(next: ActorRef) extends Actor {
    def receive = {
      case msg => next ! msg
    }
  }

}

なぜこのエラーが発生するのかについての助けをいただければ幸いです。

4

15 に答える 15

4

IntelliJ IDEA 2018 (Community Edition)を使用して、継承された Scala プロジェクトでテストを実行しようとしたときに、この問題が最近発生しました。以下の手順で修正できました:

  1. ファイル→プロジェクト構造→{特定のモジュールを選択}→「パス」タブ→「モジュールコンパイル出力パスを使用」を選択→「テスト出力パス」を変更して、 test-classesフォルダーを指すようにします。例えば:

    出力パス: /home/rustam/IdeaProjects/{project}/{module}/target/scala-2.12/classes
    テスト出力パス: /home/rustam/IdeaProjects/{project}/{module}/target/scala-2.12/テストクラス

  2. IntelliJ は 1 つのファイルで定義された複数の Scala クラスを好まないため、テスト クラスがテスト ファイルと同じ名前であることを確認し、必要に応じて後でリファクタリングできる他のヘルパー クラスをネストします。
于 2018-10-18T10:01:50.677 に答える
2

IntelliJ を使用して scalatest を実行している場合は、クラスパスが正しいことを確認してください。例えば:

 /dummyApp 

build.sbtのようになりますname := "dummyApp"。名前をname := "dummy App"付けるとエラーになります。

于 2013-09-17T15:44:14.640 に答える
1

テスト クラスの再コンパイルを試みることができます。

sbt test:compile
于 2022-02-03T11:40:50.283 に答える
0

この種のことは、時々私に起こり続けます。上記のより具体的な提案はすべてメリットがあります。別の可能性 (今回はうまくいきました): テストの実行構成を編集します。「sbt を使用」をクリックします。テストを実行します (sbt-shell を使用してテストを実行しているだけなので、問題はないはずです)。「Use sbt」の選択を解除して試してみてください。それは私のために働いた。

于 2021-01-15T17:30:38.553 に答える