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

Scala Value Classes和Mockito Matchers不一起玩

屠钊
2023-03-14

将Scala的值类与Mockito mock(匹配器)一起使用会导致NullPointerException,请参见以下示例:

import org.scalatest.FunSuite
import org.scalatest.mock.MockitoSugar._
import org.mockito.{Matchers, Mockito}

class Id(val underlying: Int) extends AnyVal

class MockitoValueClassSuite extends FunSuite {

  trait Sample {
    def doIt(id: Id) : Int
  }

  test("Check value classes in scala with mockito") {
    val sampleMock = mock[Sample]

    val id = new Id(1)

    Mockito.when(sampleMock.doIt(Matchers.eq(id))).thenReturn(5)

    assert(sampleMock.doIt(id) == 5)
  }
}

结果:

java.lang.NullPointerException was thrown.
java.lang.NullPointerException
    at net.gutefrage.service.user.service.MockitoValueClassSuite$$anonfun$1.apply$mcV$sp(MockitoValueClassSuite.scala:21)
    at net.gutefrage.service.user.service.MockitoValueClassSuite$$anonfun$1.apply(MockitoValueClassSuite.scala:16)
    at net.gutefrage.service.user.service.MockitoValueClassSuite$$anonfun$1.apply(MockitoValueClassSuite.scala:16)
    at org.scalatest.Transformer$$anonfun$apply$1.apply(Transformer.scala:22)

任何提示在这里可以做些什么?

共有2个答案

冯德宇
2023-03-14

在您的情况下,您必须使用以下内容:

Mockito.when(sampleMock.doIt(Id(Matchers.eq(id)))).thenReturn(5)

Mockito.doReturn(5).when(sampleMock).doIt(Id(Matchers.eq(id)))
丌官运珧
2023-03-14

假设NPE发生在Mockito.when-line上,我猜这是因为值类被实现为实际传递基元,然后用静态方法替换它的方法调用,而Mockito想要在对象上调用equals,或者类似的东西。如果这就是原因,那么也许你可以在Scala中实现自己的匹配器来解决这个问题。

 类似资料:
  • 我有一个测试类,它有一个带有CsvSource的参数化测试,还有其他使用CapturedOutput的测试。它们单独运行良好,但在一起运行时随机失败,没有任何接触异常。以下是示例代码: 对如何解决这个问题有什么想法吗? PS:我无法创建另一个测试文件。

  • {“时间戳”:1553613278534,“状态”:400,“错误”:“错误请求”,“消息”:“必需的字符串参数'param2'不存在”,“路径”:“/MyURL/42”} 我希望PUT的工作就像POST一样,但它似乎不是。 不幸的是,我不能将参数作为QueryParam发送,因此我应该维护相同的请求调用,因为我正在重构一个完全以这种方式工作的现有endpoint。

  • 当异常发生在CompletableFuture中时,我试图设置一个默认值,我通过如下方法使其工作: 但是,当我试图在不好的事情发生时异常地使用complete来停止CompletableFuture,并按如下方式跟踪异常时,我无法像刚才那样捕捉到异常。 更新日期2018-06-09谢谢您的帮助,@Daniele 在join()之前封闭的句柄按预期工作。但在这种情况下,

  • 我正在试验把杰克逊和龙目岛结合起来。这些是我的课: 这些是我添加到类spth中的JAR: > 龙目岛:https://projectlombok.org/downloads/lombok.jar(1.16.10version) 此外,Netbeans项目被配置为“保存时不编译”、“生成调试信息”、“报告不推荐使用的API”、“跟踪java依赖项”、“Activacte注释处理”和“编辑器中的Act

  • 我在我的项目中使用毕加索库来加载图像并缓存它们。它工作得很好,没有任何问题。但是,当我试图使用OkHttp库执行与服务器的数据通信(JSON通信)时,Picasso抛出了异常。 我使用以下JAR:OKHTTP-2.0.0-RC2、OKIO-1.0.0、Picasso-2.2.0。当我在添加这些JAR后运行我的项目时,它会崩溃,出现以下情况: 我添加okhttp只是为了使用以下方法: 为什么会这样?

  • 我在使用SpringBoot4和ThymeleafWeb及其邮件时遇到了一些问题。 如果我将SpringBoot4单独与Thymeleaf web一起使用,它将能够正常工作,而不会出现任何问题。当我包含Thymeleaf邮件配置时,问题就开始了 如果我尝试用它构建和运行,页面将无法加载。因此,我更新了包含web模板的代码。