Scala specs2 模拟特征方法总是返回 Nullpointer 异常

2024-03-21

我有一个特征,我想在测试期间模拟并在另一个服务中使用该模拟特征。问题是,当我尝试模拟 indexDocuments 函数的返回值时,我收到 NullpointerException。

测试方法:

"createDemand must return None if writing to es fails" in new WithApplication {
  val demandDraft = DemandDraft(UserId("1"), "socken bekleidung wolle", Location(Longitude(52.468562), Latitude(13.534212)), Distance(30), Price(25.0), Price(77.0))
  val es = mock[ElasticsearchClient]
  val sphere = mock[SphereClient]
  val productTypes = mock[ProductTypes]

  sphere.execute(any[ProductCreateCommand]) returns Future.successful(product)
  productTypes.demand returns ProductTypeBuilder.of("demand", ProductTypeDrafts.demand).build()
  // this line throws the nullpointer exception
  es.indexDocument(any[IndexName], any[TypeName], any[JsValue]) returns Future.failed(new RuntimeException("test exception"))

  val demandService = new DemandService(es, sphere, productTypes)
  demandService.createDemand(demandDraft) must be (Option.empty[Demand]).await
}

Trait:

sealed trait ElasticsearchClient {
  implicit def convertListenableActionFutureToScalaFuture[T](x: ListenableActionFuture[T]): Future[T] = {
    val p = Promise[T]()
    x.addListener(new ActionListener[T] {
      def onFailure(e: Throwable) = p.failure(e)
      def onResponse(response: T) = p.success(response)
    })
    p.future
  }

  lazy val client = createElasticsearchClient()
  def close(): Unit
  def createElasticsearchClient(): Client

  def indexDocument(esIndex: IndexName, esType: TypeName, doc: JsValue): Future[IndexResponse] =
    client.prepareIndex(esIndex.value, esType.value).setSource(doc.toString()).execute()
  def search(esIndex: IndexName, esType: TypeName, query: QueryBuilder): Future[SearchResponse] =
    client.prepareSearch(esIndex.value).setTypes(esType.value).setQuery(query).execute()
}

例外

[error]    NullPointerException:   (DemandServiceSpec.scala:89)
[error] services.DemandServiceSpec$$anonfun$1$$anonfun$apply$8$$anon$2$$anonfun$8.apply(DemandServiceSpec.scala:89)
[error] services.DemandServiceSpec$$anonfun$1$$anonfun$apply$8$$anon$2$$anonfun$8.apply(DemandServiceSpec.scala:89)
[error] services.DemandServiceSpec$$anonfun$1$$anonfun$apply$8$$anon$2.delayedEndpoint$services$DemandServiceSpec$$anonfun$1$$anonfun$apply$8$$anon$2$1(DemandServiceSpec.scala:89)
[error] services.DemandServiceSpec$$anonfun$1$$anonfun$apply$8$$anon$2$delayedInit$body.apply(DemandServiceSpec.scala:81)
[error] play.api.test.WithApplication$$anonfun$around$1.apply(Specs.scala:23)
[error] play.api.test.WithApplication$$anonfun$around$1.apply(Specs.scala:23)
[error] play.api.test.PlayRunners$class.running(Helpers.scala:49)
[error] play.api.test.Helpers$.running(Helpers.scala:403)
[error] play.api.test.WithApplication.around(Specs.scala:23)
[error] play.api.test.WithApplication.delayedInit(Specs.scala:20)
[error] services.DemandServiceSpec$$anonfun$1$$anonfun$apply$8$$anon$2.<init>(DemandServiceSpec.scala:81)
[error] services.DemandServiceSpec$$anonfun$1$$anonfun$apply$8.apply(DemandServiceSpec.scala:81)
[error] services.DemandServiceSpec$$anonfun$1$$anonfun$apply$8.apply(DemandServiceSpec.scala:81)

如果您需要更多信息,请告诉我。


我发现indexDocuments调用中的any[]匹配器是问题所在。当我将它们替换为实际值时,它会起作用:

"createDemand must return None if writing to es fails and deleteDemand should be called once with correct parameters" in new WithApplication {
  val demandDraft = DemandDraft(UserId("1"), "socken bekleidung wolle", Location(Longitude(52.468562), Latitude(13.534212)), Distance(30), Price(25.0), Price(77.0))
  val es = mock[ElasticsearchClient]
  val sphere = mock[SphereClient]
  val productTypes = mock[ProductTypes]

  sphere.execute(any[ProductCreateCommand]) returns Future.successful(product)
  sphere.execute(any[ProductDeleteByIdCommand]) returns Future.successful(product)
  productTypes.demand returns ProductTypeBuilder.of("demand", ProductTypeDrafts.demand).build()
  es.indexDocument(IndexName("demands"), TypeName("demands"), Json.toJson(demand)) returns Future.failed(new RuntimeException("test exception"))

  val demandService = new DemandService(es, sphere, productTypes)
  demandService.createDemand(demandDraft) must be (Option.empty[Demand]).await
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala specs2 模拟特征方法总是返回 Nullpointer 异常 的相关文章

  • 非时间戳列上的 Spark 结构化流窗口

    我收到以下形式的数据流 id timestamp val xxx 1 12 15 25 50 1 2 12 15 25 30 1 3 12 15 26 30 2 4 12 15 27 50 2 5 12 15 27 30 3 6 12 15
  • Spark scala - 按数组列分组[重复]

    这个问题在这里已经有答案了 我对 Spark Scala 很陌生 感谢你的帮助 我有一个数据框 val df Seq a a1 Array x1 x2 a b1 Array x1 a c1 Array x2 c c3 Array x2 a
  • 将 Mockito 模拟注入 Spring bean

    我想将 Mockito 模拟对象注入到 Spring 3 bean 中 以便使用 JUnit 进行单元测试 我的 bean 依赖项当前是通过使用注入的 Autowired私有成员字段上的注释 我考虑过使用ReflectionTestUtil
  • 使用Log4j在日志中输出Spark应用程序id

    我有一个用于 Spark 应用程序的自定义 Log4j 文件 我想输出 Spark 应用程序 ID 以及消息和日期等其他属性 因此 JSON 字符串结构如下所示 name time date level thread message app
  • 如何在Spring中模拟ModelMapper?

    我正在尝试为我的服务层编写单元测试 SpringBootTest class ClinicServiceTest Mock private ProcedureRepository procedureRepository InjectMock
  • scala.collection.Seq 不适用于 Java

    Using 阿帕奇火花2 0 1 Java 7 在 Apache Spark Java API 文档中 DataSet 类出现了一个example http spark apache org docs latest api java org
  • Spark:如何从spark shell运行spark文件

    我正在使用CDH 5 2 我能够使用火花外壳运行命令 如何运行包含 Spark 命令的文件 file spark 有没有办法在没有 sbt 的情况下在 CDH 5 2 中运行 编译 scala 程序 在命令行中 您可以使用 spark sh
  • 如何在android中对Log.e进行单元测试?

    我需要执行单元测试 在应用程序中发生特定情况时 我需要检查是否记录错误消息 try do something catch ClassCastException IndexOutOfBoundsException e Log e INFOTA
  • 如何使用 Spark 执行插入覆盖?

    我正在尝试将我们的 ETL Hive 脚本之一转换为 Spark 其中 Hive ETL 脚本维护一个表 其中需要在每晚新同步之前删除部分数据 Hive ETL 使用插入覆盖的方式将主表删除超过 3 天的数据 基本上创建一个临时表 其中的数
  • mockito:如何在java 8中匹配可变参数?

    我正在努力将项目从 java 7 迁移到 8 并且在 Mockito 何时 情况下遇到编译错误 我很难追踪 when queryRunner query any String class any ResultSetHandler class
  • Scala 中的多个类型下限

    我注意到tuple productIterator总是返回一个Iterator Any 想知道是否无法设置多个下限 因此它可能是最低公共超类型的迭代器 我尝试并搜索了一下 但只发现this https stackoverflow com q
  • 如何使用 Apache Livy 设置 Spark 配置属性?

    我不知道在向 Apache Livy 提交 Spark 作业时如何以编程方式传递 SparkSession 参数 这是测试 Spark 作业 class Test extends Job Int override def call jc J
  • 验证在子类上调用此方法时是否调用了重写的超类方法

    我将用这个例子来展示我的问题 我有一个带有方法的类foo 该类有一个重写此方法的子类 子类的方法调用超类的方法 我可以验证一下吗 我不想测试什么foo在超类中确实如此 我只需要验证它是否被调用 我知道重构可以有所帮助 优先考虑组合而不是继承
  • Scala 和 Spark:Windows 上的 Dataframe.write._

    有人设法使用 Spark 写入文件 尤其是 CSV 吗 数据框 http spark apache org docs latest api scala index html org apache spark sql Dataset在 Win
  • 对于值类型,asInstanceOf[X] 和 toX 之间有什么区别吗?

    我使用 IntelliJ 将 Java 代码转换为 Scala 代码的功能 通常效果很好 看来 IntelliJ 用调用替换了所有强制转换asInstanceOf 是否有任何有效的用法asInstanceOf Int asInstanceO
  • 实施策略模式的函数式方法

    我正在尝试解决一个处理从一种温度单位到另一种温度单位 摄氏度 开尔文 华氏度 转换的问题 在Java中 我需要创建一个接口并提供多个实现来封装输入类型并将结果作为输出类型的单元返回 例如开尔文到摄氏度或摄氏度到华氏度等 我已经在 scala
  • PlayFramework:如何转换 JSON 数组的每个元素

    鉴于以下 JSON values one two three 我如何在 Scala Play 中像这样转换它 values elem one elem two elem three 这很容易Play 的 JSON 转换器 https www
  • 结构化 scala 案例类的自定义 json 序列化

    我有一些用于往返 scala 案例类的工作 jackson scala 模块代码 Jackson 对于平面案例类非常有用 但是当我制作一个包含其他案例类列表的案例时 我似乎需要很多代码 考虑 abstract class Message c
  • Scala 2.10,它对 JSON 库和案例类验证/创建的影响

    显然 在 Scala 2 10 中我们得到了改进的反射 这将如何影响 lift json jerkson sjson 和朋友 此外 我们能否期望在不久的将来 Scala 中会出现内置的 JSON 语言功能 如 Groovy 的出色 GSON
  • Scala:尝试 .getOrElse 与 if/else

    我是一名相当新的 Scala 开发人员 我是一名经验丰富的 Java 开发人员 到目前为止 我一直很喜欢 Scala 的简单性 我真的很喜欢函数式结构 而且它们常常迫使你编写更简洁的代码 然而最近我注意到 由于舒适性和简单性 我最终使用了在

随机推荐