在IntelliJ中运行ScalaTest时"无法加载Suite类"

MCP*_*MCP 21 scala intellij-idea akka

今天我在Intellij中运行一个简单的TestKit测试时遇到了一些问题.这些测试是针对Scala代码的(我有Intellij的Scala插件)​​,它基于Ray Roestenburg的例子.

Intellij项目是使用"Maven模块"创建的,然后我将所有依赖项添加到并创建了我的项目.测试位于以下位置:

ActorBlast/src目录/测试/斯卡拉/ basicTest.scala

我基本上在测试中"右键单击"并选择"运行".我得到的是以下错误:

"C:\ Program Files\Java\jdk1.7.0_25\bin\java"-Didea.launcher.port = 7540 ...测试于下午2:29开始...无法加载Suite类.这可能是由于您的运行路径中的错误.

缺少类:BasicActorSpec java.lang.ClassNotFoundException:java.net.URLClassLoader $ 1.run(URLClassLoader.java:366)中的BasicActorSpec,java.security.AccessController上的java.net.URLClassLoader $ 1.run(URLClassLoader.java:355).位于java.lang.ClassLoader.findClass(URLClassLoader.java:354)的doPrivileged(本机方法)位于sun.misc.Launcher的java.lang.ClassLoader.loadClass(ClassLoader.java:424)$(AppClassLoader.loadClass)(Launcher.java: 308)在java.lang.ClassLoader.loadClass(ClassLoader.java:357)org.scalatest.tools.Runner $$ anonfun $ 35.apply(Runner.scala:2393)at org.scalatest.tools.Runner $$ anonfun $ 35 .apply(Runner.scala:2391)scala.collection.TraversableLike $$ anonfun $ filter $ 1.apply(TraversableLike.scala:264)在scala的scala.collection.immutable.List.foreach(List.scala:318).采集.TraversableLike $ class.filter(TraversableLike.scala:263)位于org.scalatest的org.scalatest.tools.Runner $ .doRunRunRunDaDoRunRun(Runner.scala:2391)的scala.collection.AbstractTraversable.filter(Traversable.scala:105). tools.Runner $$ anonfun $ runOptionallyWithPassFailReporter $ 2.apply(Runner.scala:1006)atg.scalatest.tools.Runner $$ anonfun $ runOptionallyWithPassFailReporter $ 2.apply(Runner.scala:1005)at org.scalatest.tools.Runner $ .withClassLoaderAndDispatchReporter(Runner.scala:2659)位于org.scalatest的org.scalatest.tools.Runner $ .runOptionallyWithPassFailReporter(Runner.scala:1005)org.scalatest.tools.Runner $ .run(Runner.scala:845). tools.Runner.run(Runner.scala)位于org.jetbrains.plugins的org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:144).scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:35)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at 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
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

任何关于我为什么会收到此错误的帮助都将非常感激.

yan*_*taq 10

这就是我解决相同异常的方法:

--> Right click on your project folder in IDE:
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

--> Click Add Framework Support
--> Then Check Scala
--> Click OK
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。我添加了“Play 2.0”,而不是“scala” (2认同)
  • 勾选Scala -> 未选择库 -> 无法点击确定 (2认同)

Raj*_*Raj 9

我的项目已经有了@Rustam Aliyev 提到的设置。仍然得到同样的例外。重建项目也无济于事。很奇怪;但重新启动IDE有助于解决问题

  • 可能这应该是解决 intelij 的每个问题的第一件事 (3认同)

Ale*_*Pes 7

运行构建项目-当我尝试解决另一个问题时,它帮助我解决了当我清除Cache IDEA :)时可能发生的问题。

  • 需要明确的是,我认为 AlexPes 意味着从顶部菜单构建(ctrl+f9),而不是“编辑配置”中的构建。我做了构建和重建只是为了确定 (2认同)

Rus*_*yev 7

最近,当我尝试使用IntelliJ IDEA 2018(社区版)在继承的 Scala 项目中运行测试时,发生了这个问题。以下步骤帮助我解决了这个问题:

  1. 文件→项目结构→{选择特定模块}→“路径”选项卡→选择“使用模块编译输出路径”→修改“测试输出路径”以指向测试类文件夹。例如:

    输出路径:/home/rustam/IdeaProjects/{project}/{module} /target/scala-2.12/classes
    测试输出路径:/ home/rustam/IdeaProjects/{project}/{module}/target/scala-2.12/测试类

  2. IntelliJ 不喜欢在一个文件中定义多个 Scala 类,因此请确保测试类的名称与测试文件相同,并嵌套其他帮助器类,您可以在以后根据需要重构这些类。


Ale*_*kin 6

我在使用Gatling时遇到了这个问题

我已将“gatling-classes”替换为“test-classes”

我通过替换gatling-classestest-classes文件 -> 项目结构 -> 模块 ->模块名称-> 路径 -> 测试输出路径来修复它


Ray*_*win 2

如果您使用 IntelliJ 运行 scalatest,请确保类路径正确。例如:

 /dummyApp 
Run Code Online (Sandbox Code Playgroud)

build.sbt应该看起来像,name := "dummyApp"。如果你命名它,name := "dummy App"你会得到错误。