我正在编写一个使用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依赖项。 任何帮助将不胜感激。在此先感谢!!!
答案 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的开发者