首页 文章

在IntelliJ中运行ScalaTest时'Unable to load a Suite class'

提问于
浏览
16

今天我在Intellij中运行一个简单的TestKit测试时遇到了一些问题 . 这些测试是针对Scala代码的(我有Intellij的Scala插件)并且基于Ray Roestenburg's 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在java.net.URLClassLoader的$ 1.run(URLClassLoader.java:366)在java.net.URLClassLoader的$ 1.run(URLClassLoader.java:355)在java.security.AccessController . 在java.net.URLClassLoader.findClass(URLClassLoader.java:354)doPrivileged的(本地方法)在java.lang.ClassLoader.loadClass(ClassLoader.java:424)在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)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) . collection.TraversableLike $ class.filter(TraversableLike.scala:263)在scala.collection.AbstractTraversable.filter(Traversable.scala:105)在org.scalatest.tools.Runner $ .doRunRunRunDaDoRunRun(Runner.scala:2391)在澳rg.scalatest.tools.Runner $$ anonfun $ runOptionallyWithPassFailReporter $ 2.适用(Runner.scala:1006)在org.scalatest.tools.Runner $$ anonfun $ runOptionallyWithPassFailReporter $ 2.适用(Runner.scala:1005)在org.scalatest . tools.Runner $ .withClassLoaderAndDispatchReporter(Runner.scala:2659)在org.scalatest.tools.Runner $ .runOptionallyWithPassFailReporter(Runner.scala:1005)在org.scalatest.tools.Runner $ .RUN(Runner.scala:845)在org.scalatest.tools.Runner.run在org.jetbrains.plugins.scala.testingSupport.scalaTest(Runner.scala)在org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:144) . ScalaTestRunner.main(ScalaTestRunner.java:35)位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)的sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法),位于sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43)在com.intellij.rt.execution.applic的java.lang.reflect.Method.invoke(Method.java:606) ation.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
    }
  }

}

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

8 回答

  • 2

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

    --> Right click on your project folder in IDE:
    

    enter image description here

    --> Click Add Framework Support
    --> Then Check Scala
    --> Click OK
    
  • 2

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

  • 1

    您需要设置Scala SDK . 1.)通常,intelliJ会通过在编辑器的右上角显示一条消息来询问您.2 . 您可以按照https://www.jetbrains.com/help/idea/discover-intellij-idea-for-scala.html中的说明自行完成 .

  • 0

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

    /dummyApp
    

    你的 build.sbt 应该是这样的, name := "dummyApp" . 如果您将其命名为 name := "dummy App" ,则会出现错误 .

  • 2

    就我而言,我在模块中错过了Scala方面 .

    https://blog.jetbrains.com/scala/2010/09/02/project-configuration-explained/

    一旦我正确配置模块,我就摆脱了错误 .

  • 3

    最近,当我尝试使用IntelliJ IDEA 2018(Community Edition)在继承的Scala项目中运行测试时,我遇到了这个问题 . 以下步骤帮助我解决了这个问题:

    • 文件→项目结构→{选择特定模块}→"Paths"选项卡→选择"Use module compile output path"→修改“测试输出路径”以指向测试类文件夹 . 例如:

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

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

    在我的情况下,我在 Preferences -> Build, Execution, Deployment -> sbt

    Use sbt shell for build and import 复选框已启用

    并且测试不在预期的目录 src/test 中,而是在 src/it (综合测试)中 .

  • 0

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

    I've replaced 'gatling-classes' to 'test-classes'

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

相关问题