从单元测试调用时,为什么在Scala中没有初始化隐式变量?

nicojs

给定Scala中的以下单例对象:

package demo

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.server.Directives._
import akka.stream.ActorMaterializer

import scala.concurrent.Future
import scala.io.StdIn

object WebServer extends App {

  implicit val system = ActorSystem("myActorSystem")
  implicit val executionContext = system.dispatcher
  implicit val materializer = ActorMaterializer()

  val route = {
    path("api" / "done-as-promised") {
      get {
        complete {
          Future.successful("done")
        }
      }
    }
  }

  val bindingFuture = Http().bindAndHandle(route, "localhost", 8080)

}

以及以下单元测试

package demo

import akka.http.scaladsl.testkit.ScalatestRouteTest
import org.scalactic.TypeCheckedTripleEquals
import org.scalatest.{Inspectors, Matchers, WordSpec}

class WebServerSpec extends WordSpec with Matchers with TypeCheckedTripleEquals with Inspectors with ScalatestRouteTest {

  "The WebServer /done-as-promised" should {
    "return done" in {
      // tests:
      Get("/api/done-as-promised") ~> WebServer.route ~> check {
        status.intValue() shouldEqual 200
        responseAs[String] shouldEqual "done"
      }
    }
  }
}

我收到以下错误:

[错误] [04/19/2016 07:12:18.995] [ScalaTest-运行-运行-WebServerSpec] [akka.actor.ActorSystemImpl(demo-WebServerSpec)]处理请求HttpRequest(HttpMethod(GET),http: //example.com/api/done-as-promised,List(),HttpEntity.Strict(无/无,ByteString(),HttpProtocol(HTTP / 1.1 )akka.http.scaladsl上的java.lang.NullPointerException。 server.directives.ExecutionDirectives $$ anonfun $ handleExceptions $ 1 $$ anonfun $ apply $ 1.apply(ExecutionDirectives.scala:33)位于akka.http.scaladsl.server.directives.ExecutionDirectives $$ anonfun $ handleExceptions $ 1 $$ anonfun .apply(ExecutionDirectives.scala:29)at akka.http.scaladsl.testkit.RouteTest $ TildeArrow $$ anon $ 1.apply(RouteTest.scala:162)at akka.http.scaladsl.testkit.RouteTest $ TildeArrow $$ anon $ 1 .apply(RouteTest.scala:150)

nicojs

我花了一段时间才弄清楚。关键是:删除extends app将使测试成功。

该问题的原因是,当WebServer声明为时extends App,它将使用特征的DelayedInit功能App因此,构造器中的初始化代码不会添加到WebServer对象的构造函数中。main在WebServer上调用该方法时,将调用代替因此,当他在测试中引用“路线”时,这些都将变为空。

混合DelayedInit特征(App从扩展DelayedInit)将重写您的类或对象模板。无需将val和var添加到构造函数中,而是将其添加到def delayedInit(body: => Unit)钩子中(用户代码无法访问)。显然,只要调用main方法,就会调用此方法。

您可以通过在测试内的WebServer上简单地调用“ main”来验证这一点。如果执行此操作,则测试将通过。这是因为调用main会触发初始化,从而导致创建了这些对象。

一般来说,虽然正确的解决方案可能是将路由移动到其他地方,而不是将其放置在基本应用程序内部。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么要在Swift中为struct编写初始化程序才能在单元测试中使用它?

来自分类Dev

为什么我的变量没有初始化?

来自分类Dev

C# 隐式变量如果没有初始化它如何存储

来自分类Dev

为什么我的全局变量没有在Test :: Class中初始化?

来自分类Dev

为什么我的变量没有在此代码中初始化?

来自分类Dev

为什么我的全局变量没有在Test :: Class中初始化?

来自分类Dev

为什么我的变量没有在此代码中初始化?

来自分类Dev

用不可变且没有初始化程序的参数对方法进行单元测试的最佳方法是什么?

来自分类Dev

初始化对象后,使用隐式转换而不是赋值运算符调用构造函数有什么意义?

来自分类Dev

Java为什么说我的变量什么时候没有初始化?

来自分类Dev

在for循环初始化中使用let时,为什么封闭范围中没有let变量?

来自分类Dev

在单元测试中模拟行为。为什么验证方法调用是有益的?

来自分类Dev

模拟单元测试中的行为。为什么验证方法调用有好处?

来自分类Dev

为什么我的代码块实例变量没有初始化并打印出“ NSGlobalBlock”?

来自分类Dev

为什么最新的Swift版本总是说变量在使用前没有初始化

来自分类Dev

在复制初始化中,对复制构造函数的调用是显式还是隐式的?

来自分类Dev

异步初始化及其单元测试

来自分类Dev

单元测试Angular Controller的初始化功能

来自分类Dev

单元测试-在哪里放置初始化代码?

来自分类Dev

单元测试初始化情节提要

来自分类Dev

为什么我的写方法没有初始化?

来自分类Dev

为什么这似乎没有初始化

来自分类Dev

模板类的静态成员变量的隐式初始化

来自分类Dev

隐式类型的局部变量必须初始化

来自分类Dev

隐式类型的局部变量必须初始化

来自分类Dev

在Python 3中隐式调用基本元类初始化函数

来自分类Dev

从Ruby中的单元测试初始化env.rb

来自分类Dev

角单元测试在指令中初始化“无名”控制器

来自分类Dev

Django中的单元测试:如何初始化数据库

Related 相关文章

  1. 1

    为什么要在Swift中为struct编写初始化程序才能在单元测试中使用它?

  2. 2

    为什么我的变量没有初始化?

  3. 3

    C# 隐式变量如果没有初始化它如何存储

  4. 4

    为什么我的全局变量没有在Test :: Class中初始化?

  5. 5

    为什么我的变量没有在此代码中初始化?

  6. 6

    为什么我的全局变量没有在Test :: Class中初始化?

  7. 7

    为什么我的变量没有在此代码中初始化?

  8. 8

    用不可变且没有初始化程序的参数对方法进行单元测试的最佳方法是什么?

  9. 9

    初始化对象后,使用隐式转换而不是赋值运算符调用构造函数有什么意义?

  10. 10

    Java为什么说我的变量什么时候没有初始化?

  11. 11

    在for循环初始化中使用let时,为什么封闭范围中没有let变量?

  12. 12

    在单元测试中模拟行为。为什么验证方法调用是有益的?

  13. 13

    模拟单元测试中的行为。为什么验证方法调用有好处?

  14. 14

    为什么我的代码块实例变量没有初始化并打印出“ NSGlobalBlock”?

  15. 15

    为什么最新的Swift版本总是说变量在使用前没有初始化

  16. 16

    在复制初始化中,对复制构造函数的调用是显式还是隐式的?

  17. 17

    异步初始化及其单元测试

  18. 18

    单元测试Angular Controller的初始化功能

  19. 19

    单元测试-在哪里放置初始化代码?

  20. 20

    单元测试初始化情节提要

  21. 21

    为什么我的写方法没有初始化?

  22. 22

    为什么这似乎没有初始化

  23. 23

    模板类的静态成员变量的隐式初始化

  24. 24

    隐式类型的局部变量必须初始化

  25. 25

    隐式类型的局部变量必须初始化

  26. 26

    在Python 3中隐式调用基本元类初始化函数

  27. 27

    从Ruby中的单元测试初始化env.rb

  28. 28

    角单元测试在指令中初始化“无名”控制器

  29. 29

    Django中的单元测试:如何初始化数据库

热门标签

归档