首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Play Framework2.2.0Scala (spec2,Mockito)中测试akka演员

如何在Play Framework2.2.0Scala (spec2,Mockito)中测试akka演员
EN

Stack Overflow用户
提问于 2013-10-02 23:08:39
回答 3查看 6.3K关注 0票数 5

我正在尝试用Play框架设置一些单元测试。我的很多逻辑都建立在预定的akka演员中,这些演员会在后台进行数据收集。我的问题是我不知道如何对它们进行单元测试。我根本不知道该如何接近它。我试着用阿克卡测试包,但我基本上是在四处乱晃。有没有人对如何接近它有任何建议?例子将是非常有用的。这是我目前正在处理的令人憎恶的一个例子:

代码语言:javascript
复制
package test

import org.specs2.mutable._
import controllers.Scanner
import java.util.UUID
import org.joda.time.DateTime
import akka.testkit.TestActorRef
import play.api.Logger
import play.api.test.{FakeApplication, TestServer}
import models.PSqlEnum

class ScannerTest extends Specification {
  val appId = UUID.randomUUID()
  val app = models.App(appId, "TestApp", "TestServer", "TestComponent", "Test Description", DateTime.now(),
                       DateTime.now(), true, 3, 60, PSqlEnum("scanType", "mandatory"), "http://localhost")
  val rules = <Rule name="DivisionDataIsAvailable" elementsToCheck="DivisionDataIsAvailable"
                    ruleType="is, true, yellow" />
              <Rule name="DivisionDataLoadIsHealthy" elementsToCheck="DivisionDataLoadIsHealthy"
                    ruleType="is, true, red" />;

  "Scanner" should {
    "test something" in {
      val fakeApp = TestServer(3333)
      fakeApp.start()
      implicit val actorSystem = play.api.libs.concurrent.Akka.system(fakeApp.application)
      val scanner = TestActorRef(new Scanner(app, rules)).underlyingActor
      Logger.warn(scanner.getResponseFromWebService.toString)
      fakeApp.stop()
      1 === 1
    }
  }
}

这显然不是真的测试任何东西。我基本上是想让它在这一点上通过1 === 1,只是为了看看我是否能让运行时错误停止。此代码正在生成的错误如下:

代码语言:javascript
复制
INFO  - Starting application default Akka system.
[info] ScannerTest
[info] Scanner should
[info] ! test something
[error]     ThrowableException: akka.actor.LocalActorRef.<init>(Lakka/actor/ActorSystemImpl;Lakka/actor/Props;Lakka/actor/InternalActorRef;Lakka/actor/ActorPath;)V (TestActorRef.scala:21)
[error] akka.testkit.TestActorRef.<init>(TestActorRef.scala:21)
[error] akka.testkit.TestActorRef$.apply(TestActorRef.scala:135)
[error] akka.testkit.TestActorRef$.apply(TestActorRef.scala:132)
[error] akka.testkit.TestActorRef$.apply(TestActorRef.scala:125)
[error] test.ScannerTest$$anonfun$1$$anonfun$apply$3.apply(ScannerTest.scala:27)
[error] test.ScannerTest$$anonfun$1$$anonfun$apply$3.apply(ScannerTest.scala:23)
[error] akka.actor.LocalActorRef.<init>(Lakka/actor/ActorSystemImpl;Lakka/actor/Props;Lakka/actor/InternalActorRef;Lakka/actor/ActorPath;)V
[error] akka.testkit.TestActorRef.<init>(TestActorRef.scala:21)
[error] akka.testkit.TestActorRef$.apply(TestActorRef.scala:135)
[error] akka.testkit.TestActorRef$.apply(TestActorRef.scala:132)
[error] akka.testkit.TestActorRef$.apply(TestActorRef.scala:125)
[error] test.ScannerTest$$anonfun$1$$anonfun$apply$3.apply(ScannerTest.scala:27)
[error] test.ScannerTest$$anonfun$1$$anonfun$apply$3.apply(ScannerTest.scala:23)
[info] Total for specification ScannerTest
[info] Finished in 86 ms
[info] 1 example, 0 failure, 1 error
[info] test.ScannerTest

我认为我需要创建一个FakeApplication,并使用FakeApplication的Akka.system;但是,我不知道该如何做。老实说,我甚至不确定这是否正确的做法。如果我能生成一个通用的Akka.system并完成这项工作,我会欣喜若狂的。如果有人对如何解决这个问题有任何想法,我会非常感激的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-03 10:24:02

好吧,我想出来了。确保您使用的是正确版本的。在Play 2.2.0中,我试图使用akka 2.2.M3。很明显,这不管用。我必须将正确的依赖项放在我的Build.scala中,最终的结果是:

代码语言:javascript
复制
"com.typesafe.akka" %% "akka-testkit" % "2.2.0" % "test"

我的实际测试代码如下:

代码语言:javascript
复制
package test

import org.specs2.mutable._
import controllers.Scanner
import java.util.UUID
import org.joda.time.DateTime
import akka.testkit.TestActorRef
import play.api.Logger
import models.PSqlEnum
import akka.actor.ActorSystem
import com.typesafe.config.ConfigFactory
import scala.concurrent.ExecutionContext.Implicits.global

class ScannerTest extends Specification {
  val appId = UUID.randomUUID()
  val app = models.App(appId, "TestApp", "TestServer", "TestComponent", "Test Description", DateTime.now(),
                       DateTime.now(), true, 3, 60, PSqlEnum("scanType", "mandatory"), "http://localhost")
  val rules = <Rule name="DivisionDataIsAvailable" elementsToCheck="DivisionDataIsAvailable"
                    ruleType="is, true, yellow" />
              <Rule name="DivisionDataLoadIsHealthy" elementsToCheck="DivisionDataLoadIsHealthy"
                    ruleType="is, true, red" />;


  "Scanner" should {
    "test something" in {
      implicit val actorSystem = ActorSystem("testActorSystem", ConfigFactory.load())
      val scanner = TestActorRef(new Scanner(app, rules)).underlyingActor
      val response = scanner.getResponseFromWebService
      response onSuccess {
        case result => Logger.warn(result.toString)
      }
      response onFailure {
        case error => Logger.warn(error.toString)
      }
      1 === 1
    }
  }
}

显然,这个测试并没有真正做任何事情。正在评估的实际测试是1 === 1,它现在确实打印到日志上,这意味着我可以返回并验证数据类型和响应的有效负载,然后构建一些实际的单元测试。我希望有人发现这有用。但是,原始问题中的这些错误消息是由akka-testkit依赖项与Akka不同的版本引起的,这可能对某些人很有用。

票数 10
EN

Stack Overflow用户

发布于 2014-03-28 10:17:48

我没有使用spec2或Mockito,但是在游戏2.2.1中,我要对Akka演员进行单元测试:

代码语言:javascript
复制
import org.specs2.mutable.Specification
import scala.concurrent.duration._
import org.scalatest.concurrent._
import akka.testkit._
import org.scalatest.matchers.ShouldMatchers
import org.scalatest.{FlatSpec, BeforeAndAfterAll}
import akka.actor.{Props, ActorSystem}
import akka.pattern.ask
import akka.util.Timeout
import scala.util.{Failure, Success}
import model.BlacklistEntry
import scala.concurrent.{Future, Promise, Await}
import scala.concurrent.ExecutionContext.Implicits.global
import play.api.test.FakeApplication
import model.BlacklistEntryImpl


class LicenceBlackListSpec(_system: ActorSystem) extends TestKit(_system) with ImplicitSender with ShouldMatchers with FlatSpec with BeforeAndAfterAll {
  play.api.Play.start(FakeApplication())

  import akka.testkit.TestKit._
  def this() = this( ActorSystem("LicenceBlackListSpec") )

  override def afterAll: Unit = {
    system.shutdown()
    system.awaitTermination(10.seconds)
  }

  implicit val timeout = Timeout(10 seconds)
  val blacklistRef = TestActorRef(Props[LicenceBlackList])

  "An LicenceBlackList Actor" should "be able to create a new blacklist entry" in {
    blacklistRef ! CreateEntry(BlacklistEntryImpl("NEW_KEY",1000,"Test creation"))

    val expected: BlacklistEntry = BlacklistEntryImpl("NEW_KEY", 1000 ,"Test creation")
    expectMsg( expected )
  }
}

您需要将最大规模的库作为一个依赖项,以及akka测试工具包:

"org.scalatest“% "scalatest_2.10”% "1.9.1“

希望这能帮上忙。

票数 0
EN

Stack Overflow用户

发布于 2014-09-07 18:34:47

我不使用ActorSystem("testActorSystem“),我试过允许play框架使用通常的akka插件。这种方法有很多好处:我可以在所有代码中使用play.api.libs.concurrent.Akka.system,我可以有额外的配置选项来理解booth和akka代码部分。

代码语言:javascript
复制
  class BaseActorTester (_app: Application) extends akka.testkit.TestKit(play.api.libs.concurrent.Akka.system(_app)) with FunSuiteLike with BeforeAndAfterAll {

   def this() = this(FakeApplication(additionalConfiguration=Map("currency.db"->"airando-test")))
   implicit val app: Application = _app
   implicit val ec = play.api.libs.concurrent.Akka.system.dispatcher

   override def beforeAll {
     Play.start(app)
   }
   // play plugin do it itself ??
   //override def afterAll {
   //  akka.testkit.TestKit.shutdownActorSystem(system)
   //}
   ...
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19148263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档