【问题标题】:Not able to mock the getTimestamp method on mocked Row无法在模拟行上模拟 getTimestamp 方法
【发布时间】:2019-01-30 17:35:12
【问题描述】:

我正在编写一个使用 Scala 与 Cassandra 交互的应用程序。在执行单元测试时,我正在使用 mockito,其中我正在模拟 resultSet 和 row

  val mockedResultSet = mock[ResultSet]
  val mockedRow = mock[Row]

现在一边模拟 mockedRow 的方法,比如

  doReturn("mocked").when(mockedRow).getString("ColumnName")

工作正常。但是,我无法模拟 mockedRow 的 getTimestamp 方法。我尝试了 2 种方法,但没有成功。

第一种方法

  val testDate = "2018-08-23 15:51:12+0530"
  val formatter = new SimpleDateFormat("yyyy-mm-dd HH:mm:ssZ")
  val date: Date = formatter.parse(testDate)
  doReturn(date).when(mockedRow).getTimestamp("ColumnName")

第二种方法

when(mockedRow.getTimestamp("column")).thenReturn(Timestamp.valueOf("2018-08-23 15:51:12+0530"))

它们都返回 null ,即它不返回 getTimestamp 方法的模拟值。我在我的项目中使用 cassandra 驱动程序核心 3.0 依赖项。 任何帮助将不胜感激。提前谢谢!!!

【问题讨论】:

    标签: scala cassandra mockito


    【解决方案1】:

    模拟您不拥有的对象通常被认为是一种不好的做法,也就是说,您可以尝试查看发生了什么是验证与模拟的交互,即

    verify(mockedRow).getTimestamp("column")
    

    假设您从模拟中得到 null,该语句应该会失败,但失败会显示模拟收到的所有实际调用(及其参数),这应该有助于您进行调试。

    减少此类问题的一种方法是使用mockito session,在标准模拟中,它们只能通过 JUnit 运行器使用,但使用mockito-scala,您可以像这样手动使用它们

    MockitoScalaSession().run {
       val mockedRow = mock[Row]
       when(mockedRow.getTimestamp("column")).thenReturn(Timestamp.valueOf("2018-08-23 15:51:12+0530"))
       //Execute your test
    }
    

    该代码将检查模拟没有被任何尚未被存根的东西调用,它还会告诉您是否提供了实际未使用的存根以及其他一些东西。

    如果您喜欢这种行为(并且您正在使用 ScalaTest),您可以使用 MockitoFixture 将其自动应用于每个测试

    我是 mockito-scala btw 的开发者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-11
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多