测试Akka actor时,我收到错误消息:MyActor上找不到匹配的构造函数

问题描述

我正在为Akka演员创建测试,由于某种原因,它不允许我创建演员。它引发一条消息,提示no matching constructor found on class SimpleActor。在基于Akka版本2.4.x的on this issue上,这似乎是一个错误,但是我使用的是更新版本。我正在使用以下build.sbt

name := """explore-akka"""
version := "1.1"
scalaVersion := "2.12.7"
val akkaVersion = "2.6.10"
val scalaBinVersion = "2.12"
val scalaTestVersion = "3.2.2"

libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-actor" % akkaVersion,"com.typesafe.akka" %% "akka-testkit" % akkaVersion,"org.scalatest" %% "scalatest" % scalaTestVersion
)

mainClass in Compile := Some("org.github.felipegutierrez.explore.akka.MainClass")

enablePlugins(JavaAppPackaging)
enablePlugins(DockerPlugin)
dockerUsername := Some("felipeogutierrez")

和Scala中的以下测试类:

package org.github.felipegutierrez.explore.akka.tests

import akka.actor.{Actor,ActorSystem,Props}
import akka.testkit.{ImplicitSender,TestKit}
import org.scalatest.BeforeAndAfterall
import org.scalatest.wordspec.AnyWordSpecLike

class BasicSpec extends TestKit(ActorSystem())
  with ImplicitSender with AnyWordSpecLike with BeforeAndAfterall {

  override def afterall(): Unit = {
    TestKit.shutdownActorSystem(system)
  }
  import BasicSpec._
  "a simple actor" should {
    "send back the same message" in {
      val echoActor = system.actorOf(Props[SimpleActor])
      val message = "hello,test"
      echoActor ! message

      expectMsg(message)
    }
  }
  object BasicSpec {
    class SimpleActor extends Actor {
      override def receive: Receive = {
        case message => sender() ! message
      }
    }

  }
}

我也尝试了val echoActor = system.actorOf(Props[SimpleActor],name = "SimpleActor")val echoActor = TestActorRef(Props[SimpleActor]),但是我一直收到此错误

no matching constructor found on class org.github.felipegutierrez.explore.akka.tests.BasicSpec$BasicSpec$SimpleActor for arguments []
java.lang.IllegalArgumentException: no matching constructor found on class org.github.felipegutierrez.explore.akka.tests.BasicSpec$BasicSpec$SimpleActor for arguments []
    at akka.util.Reflect$.error$1(Reflect.scala:89)
    at akka.util.Reflect$.findConstructor(Reflect.scala:113)
    at akka.actor.NoArgsReflectConstructor.<init>(IndirectActorProducer.scala:108)
    at akka.actor.IndirectActorProducer$.apply(IndirectActorProducer.scala:63)
    at akka.actor.Props.producer(Props.scala:131)
    at akka.actor.Props.<init>(Props.scala:144)
    at akka.actor.Props$.apply(Props.scala:62)
    at org.github.felipegutierrez.explore.akka.tests.BasicSpec.$anonfun$new$2(BasicSpec.scala:20)
    at org.scalatest.OutcomeOf.outcomeOf(OutcomeOf.scala:85)
    at org.scalatest.OutcomeOf.outcomeOf$(OutcomeOf.scala:83)
    at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
    at org.scalatest.Transformer.apply(Transformer.scala:22)
    at org.scalatest.Transformer.apply(Transformer.scala:20)
    at org.scalatest.wordspec.AnyWordSpecLike$$anon$3.apply(AnyWordSpecLike.scala:1076)
    at org.scalatest.TestSuite.withFixture(TestSuite.scala:196)
    at org.scalatest.TestSuite.withFixture$(TestSuite.scala:195)
    at org.github.felipegutierrez.explore.akka.tests.BasicSpec.withFixture(BasicSpec.scala:8)
    at org.scalatest.wordspec.AnyWordSpecLike.invokeWithFixture$1(AnyWordSpecLike.scala:1074)
    at org.scalatest.wordspec.AnyWordSpecLike.$anonfun$runTest$1(AnyWordSpecLike.scala:1086)
    at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306)
    at org.scalatest.wordspec.AnyWordSpecLike.runTest(AnyWordSpecLike.scala:1086)
    at org.scalatest.wordspec.AnyWordSpecLike.runTest$(AnyWordSpecLike.scala:1068)
    at org.github.felipegutierrez.explore.akka.tests.BasicSpec.runTest(BasicSpec.scala:8)
    at org.scalatest.wordspec.AnyWordSpecLike.$anonfun$runTests$1(AnyWordSpecLike.scala:1145)
    at org.scalatest.SuperEngine.$anonfun$runTestsInBranch$1(Engine.scala:413)
    at scala.collection.immutable.List.foreach(List.scala:388)
    at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
    at org.scalatest.SuperEngine.runTestsInBranch(Engine.scala:390)
    at org.scalatest.SuperEngine.$anonfun$runTestsInBranch$1(Engine.scala:427)
    at scala.collection.immutable.List.foreach(List.scala:388)
    at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
    at org.scalatest.SuperEngine.runTestsInBranch(Engine.scala:396)
    at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:475)
    at org.scalatest.wordspec.AnyWordSpecLike.runTests(AnyWordSpecLike.scala:1145)
    at org.scalatest.wordspec.AnyWordSpecLike.runTests$(AnyWordSpecLike.scala:1144)
    at org.github.felipegutierrez.explore.akka.tests.BasicSpec.runTests(BasicSpec.scala:8)
    at org.scalatest.Suite.run(Suite.scala:1112)
    at org.scalatest.Suite.run$(Suite.scala:1094)
    at org.github.felipegutierrez.explore.akka.tests.BasicSpec.org$scalatest$wordspec$AnyWordSpecLike$$super$run(BasicSpec.scala:8)
    at org.scalatest.wordspec.AnyWordSpecLike.$anonfun$run$1(AnyWordSpecLike.scala:1190)
    at org.scalatest.SuperEngine.runImpl(Engine.scala:535)
    at org.scalatest.wordspec.AnyWordSpecLike.run(AnyWordSpecLike.scala:1190)
    at org.scalatest.wordspec.AnyWordSpecLike.run$(AnyWordSpecLike.scala:1188)
    at org.github.felipegutierrez.explore.akka.tests.BasicSpec.org$scalatest$BeforeAndAfterall$$super$run(BasicSpec.scala:8)
    at org.scalatest.BeforeAndAfterall.liftedTree1$1(BeforeAndAfterall.scala:213)
    at org.scalatest.BeforeAndAfterall.run(BeforeAndAfterall.scala:210)
    at org.scalatest.BeforeAndAfterall.run$(BeforeAndAfterall.scala:208)
    at org.github.felipegutierrez.explore.akka.tests.BasicSpec.run(BasicSpec.scala:8)
    at org.scalatest.tools.SuiteRunner.run(SuiteRunner.scala:45)
    at org.scalatest.tools.Runner$.$anonfun$doRunRunRunDaDoRunRun$13(Runner.scala:1320)
    at org.scalatest.tools.Runner$.$anonfun$doRunRunRunDaDoRunRun$13$adapted(Runner.scala:1314)
    at scala.collection.immutable.List.foreach(List.scala:388)
    at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1314)
    at org.scalatest.tools.Runner$.$anonfun$runoptionallyWithPassFailReporter$24(Runner.scala:993)
    at org.scalatest.tools.Runner$.$anonfun$runoptionallyWithPassFailReporter$24$adapted(Runner.scala:971)
    at org.scalatest.tools.Runner$.withClassLoaderAnddispatchReporter(Runner.scala:1480)
    at org.scalatest.tools.Runner$.runoptionallyWithPassFailReporter(Runner.scala:971)
    at org.scalatest.tools.Runner$.run(Runner.scala:798)
    at org.scalatest.tools.Runner.run(Runner.scala)
    at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2or3(ScalaTestRunner.java:40)
    at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:27)

更新:更奇怪的是,当我使用the official doc中的以下测试时,它可以工作!但是,当我将相同的代码TestActors.echoActorProps复制到我的SimpleActor时,它不起作用。

  "An Echo actor" must {
    "send back messages unchanged" in {
      val echo = system.actorOf(TestActors.echoActorProps)
      echo ! "hello world"
      expectMsg("hello world")
    }
  }

解决方法

我更改了library(tidyverse) sample_points %>% mutate(from = map2(from,to,seq,by = 'year')) %>% unnest(from) %>% group_by(point) %>% mutate(to = lead(from)) %>% filter(!is.na(to)) # point from to label # <chr> <date> <date> <chr> #1 1 2004-05-01 2005-05-01 cropland #2 1 2005-05-01 2006-05-01 cropland #3 1 2006-05-01 2007-05-01 cropland #4 2 2009-05-01 2010-05-01 grassland #5 2 2010-05-01 2011-05-01 grassland #6 2 2011-05-01 2012-05-01 grassland #7 3 2014-05-01 2015-05-01 forest #8 3 2015-05-01 2016-05-01 forest 的实现,并且成功了。我不确定为什么即使我从official documentation实现了相同的代码也无法正常工作。完整的代码如下:

val propsSimpleActor = {Props(new SimpleActor)}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...