当前位置: 首页 > 知识库问答 >
问题:

带有value类参数的Mockito stubbing方法因NullPointerException而失败

权玉泽
2023-03-14

使用类型化值类作为IDs是Scala中的一种常见html" target="_blank">模式。但是,Mockito在对以值类为参数的方法进行存根时似乎有一个问题。在下面的示例中,具有实际值的第一个存根工作得很好,但使用参数匹配器的第二个存根抛出NullPointerException。

我找到的唯一参考是这个问题,但那里显示的解决方案不起作用。有人知道解决这个问题的方法吗?

import org.specs2.mutable.Specification
import org.specs2.matcher.Matchers
import org.specs2.mock.Mockito

case class ID[T](val id:Long) extends AnyVal

trait DAO[T]{
  def get(id:ID[T]):T
}

class MockitoIDStubTest extends Specification with Mockito with Matchers{
  "Mockito" should{
    "properly stub with argument value" in {
      val m = mock[DAO[String]
      m.get(ID[String](1)).returns("abc")
      m.get(ID[String](1)) must_== "abc"
    }
    "properly stub with argument matcher" in {
      val m = mock[DAO[String]
      m.get(any[ID[String]]).returns("abc")
      m.get(ID[String](1)) must_== "abc"
    }
  }
}

[error]NullPointerException:(MockitoidStubtest.Scala:20)

[error]mockitoidstubtest$$anonfun$1$$anonfun$apply$5$$anonfun$apply$6.apply(Mockitoidstubtest.scala:20)

共有1个答案

穆旭尧
2023-03-14

它似乎可以与scalamock和Scalatest一起工作。我仍然想为Mockito找到一个解决方案,这样我就不必改变几百个测试了。

import org.scalatest._
import org.scalamock.scalatest.MockFactory

case class ID[T](val id:Long) extends AnyVal

trait DAO[T]{
  def get(id:ID[T]):T
}

class ScalaMockIDStubTest extends WordSpec with MockFactory{
  import language.postfixOps

  "ScalaMock" should{
    "properly stub with argument value" in {
      val m = stub[DAO[String]
      (m.get _) when(ID[String](1)) returns("abc")
      assert( m.get(ID[String](1)) == "abc")
    }
    "properly stub with argument matcher" in {
      val m = stub[DAO[String]
      (m.get _) when(*) returns("abc")
      assert( m.get(ID[String](1)) == "abc")
    }
  }
}
 类似资料:
  • 我有4个gradle构建文件:当我在android studio中构建时,我经常出现以下错误: 没有方法的签名:org.gradle.model.ModelMap.getDefaultProguardFile()适用于参数类型:(java.lang.String)值:[proguard android.txt] 文件1 文件2 文件3 文件4 请:有人能帮我理解为什么我总是以下错误: 没有方法的签

  • 我已经得到了一个抽象类位置的UML图。该类有一个变量字符串名称。它的方法是addEmployee(employee:employee):boolean。 Employee类与Location类相关联。Employee类必须包含变量String name和String address以及方法getName():String和getAddress():String 我不确定如何制作addEmploye

  • 是否有可能将方法引用与参数一起使用?我喜欢流的想法,我只是想让代码更易读。 实际上,我认为有一个类似的问题,方法引用了一个参数,我读了,但不知道如何在我的代码中使用bind2方法。这是唯一的解决办法吗?

  • 问题内容: 我编写了一个简单的类来测试响应读取实体方法(如果它按我的预期工作)。但是效果不佳。 当我启动课程时,出现以下错误: supported on an outbound message. at org.glassfish.jersey.message.internal.OutboundJaxrsResponse.readEntity(OutboundJaxrsResponse.java:1

  • 我正在使用Code::Blocks 12.11(使用MinGW),当我想在设置程序参数后启动调试会话时,GDB调试器在一开始就停止执行,整个程序就会冻结。这让我大吃一惊,因为我无法调试需要命令行参数的程序。这是“调试器”窗口中的最后两行(在此之后,什么都没有发生,代码::块冻结): 有谁知道为什么GDB不使用命令行参数的原因?

  • 问题内容: 在Java 8中,具有以下类 可以通过方法引用来调用setBornTrue方法: 但是我将如何使用forEach方法并通过 方法引用 使用setBorn ?试: 导致错误“无法解析方法setBorn”。 另外,我该如何传递True的值? 问题答案: 使用lambda: 没有发现仅使用Java 8 API的其他方法。 使用此自定义功能: 你可以做: 如果Java API或库中提供了这种实