无法在模拟的Row上模拟getTimestamp方法

时间:2018-08-24 09:07:32

标签: scala cassandra mockito

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

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

现在在模拟嘲笑的行的方法时,例如

  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依赖项。 任何帮助将不胜感激。在此先感谢!!!

1 个答案:

答案 0 :(得分:0)

嘲笑您不拥有的对象通常被认为是不好的做法,也就是说,您可以尝试查看正在发生的事情是验证与模拟的交互,即

verify(mockedRow).getTimestamp("column")

鉴于您在模拟过程中得到的是空值,该语句应该失败,但是失败将显示该模拟过程收到的所有实际调用(及其参数),这将有助于您进行调试。

一种最小化此类问题的方法是使用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的开发者