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

时间:2013-09-16 21:58:37

标签: scala intellij-idea akka

今天我在Intellij中运行一个简单的TestKit测试时遇到了一些问题。这些测试适用于Scala代码(我有Intellij的Scala插件)​​并且基于Ray Roestenburg's example

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:   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)at at   java.lang.ClassLoader.loadClass(ClassLoader.java:357)at   org.scalatest.tools.Runner $$ anonfun $ 35.apply(Runner.scala:2393)at at   org.scalatest.tools.Runner $$ anonfun $ 35.apply(Runner.scala:2391)at at   scala.collection.TraversableLike $$ anonfun $ $过滤器1.适用(TraversableLike.scala:264)     在scala.collection.immutable.List.foreach(List.scala:318)at   scala.collection.TraversableLike $ class.filter(TraversableLike.scala:263)     在scala.collection.AbstractTraversable.filter(Traversable.scala:105)     在   org.scalatest.tools.Runner $ .doRunRunRunDaDoRunRun(Runner.scala:2391)     在   org.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)at   org.scalatest.tools.Runner.run(Runner.scala)at   org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:144)     在   org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:35)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:606)at   com.intellij.rt.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
    }
  }

}

任何有关我为何会收到此错误的帮助都会非常感激。

15 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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

中的说明自行完成

答案 3 :(得分:3)

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

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

enter image description here

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

答案 4 :(得分:2)

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

 /dummyApp 

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

答案 5 :(得分:2)

就我而言,我错过了模块中的Scala方面。

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

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

答案 6 :(得分:1)

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

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

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

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

答案 7 :(得分:0)

就我而言,我曾在Preferences -> Build, Execution, Deployment -> sbt

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

测试不在预期的目录src/test中,而在src/it中(集成测试)。

答案 8 :(得分:0)

使用Gatling

时遇到了这个问题

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

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

答案 9 :(得分:0)

当测试类不属于任何软件包时,我遇到了错误。

答案 10 :(得分:0)

我正在使用multi maven模块,并在这里尝试了所有可能性,但无法解决此问题。但是对我来说 我关闭了完整的IntelliJ->删除了.idea文件夹->从“最近的项目”窗口中删除了托管项目。->重新导入项目 完成了任务。

答案 11 :(得分:0)

这种事情时不时发生在我身上。以上所有更具体的建议都有其优点。另一种可能性(这次对我有用):编辑测试的运行配置;点击“使用sbt”;运行测试(这应该没有问题,因为它只是使用 sbt-shell 来运行测试);现在取消选择“使用 sbt”并尝试一下。它对我有用。

答案 12 :(得分:0)

长长的检查列表中的另一个,如果你不使用唯一的测试名称,你会在没有任何提示的情况下得到这个错误,在一个很长的测试套件中更容易错过。
失败

test("Check thing 1") {
 class TestClass1 extends MainClass1{
 ... }
test("Check thing 1") {
 class TestClass2 extends MainClass2{
 ... }

成功

test("Check thing 1") {
 class TestClass1 extends MainClass1{
 ... }
test("Check thing 2") {
 class TestClass2 extends MainClass2{
 ... }

答案 13 :(得分:0)

我在 Idea 2021.1 上收到了同样的消息。我尝试了上述所有方法,但对我有帮助的是通过 sbt 运行 Scala 测试,如下所示:

       QuestionBank questionBank = new QuestionBank();
     questionBank.mQuestionList.observe(getViewLifecycleOwner(), new Observer<List<Question>>() {
          @Override
          public void onChanged(List<Question> questions) {
          if (!questions.isEmpty()){
               textView.setText(questions.get(0).getQuestion());
                Log.d("TAG==>>","New Question added  Total size = "+questions.size());
                }
            }
      });

之后,我可以通过 Idea 调试相同的测试。

答案 14 :(得分:-1)

仅运行构建项目对我有用。