【问题标题】:Scala test traits with MockitoScala 使用 Mockito 测试特征
【发布时间】:2014-07-03 14:54:11
【问题描述】:

我是 Scala 的新手。目前我正在接受训练以实现特征的模拟测试。有人可以帮我实施吗?我想在特征SeasonalityServiceImpl 和测试方法hMock.doSomeForF() 中模拟方法seasonalityDao.doSomeForB 和seasonalityDao.doSomeForB1。

更新: 我已经根据下面的 cmets 更正了代码。在这种情况下,当我尝试验证模拟方法 verify(sMock).doSomeForB() verify(sMock).doSomeForB1() 时,我收到下一个错误: 需要但未调用: 季节性道.doSomeForB(); -> 在 Main$$anonfun$1.apply$mcV$sp(Main.scala:12) 实际上,与此模拟的交互为零。

这是一个代码(我只是简化了项目的重要部分作为示例):

import org.scalatest._
import org.mockito.Mockito._

class Main extends FunSuite with SeasonalityServiceComponentImpl with SeasonalityDaoComponent {
  test("some test") {
    def hMock = mock(classOf[SeasonalityServiceImpl])
    def sMock = mock(classOf[SeasonalityDao])

    when(sMock.doSomeForB()).thenReturn(Option(2))
    when(sMock.doSomeForB1()).thenReturn(10)

    verify(sMock).doSomeForB()
    verify(sMock).doSomeForB1()

    println("With Option " + hMock.doSomeForF())
    println("Without Option " + hMock.doSomeForF1())
  }

  override def seasonalityDao: SeasonalityDao = mock(classOf[SeasonalityDao])

  override def seasonalityService: SeasonalityService = mock(classOf[SeasonalityService])
}

trait SeasonalityDaoComponent {
  def seasonalityDao: SeasonalityDao

  trait SeasonalityDao {
    def doSomeForB(): Option[Int]
    def doSomeForB1(): Int
  }
}

trait SeasonalityServiceComponent {
  def seasonalityService: SeasonalityService

  trait SeasonalityService {
    def doSomeForF(): Option[Int]
    def doSomeForF1(): Int
  }
}

trait SeasonalityServiceComponentImpl extends SeasonalityServiceComponent {
  this: SeasonalityDaoComponent =>

  trait SeasonalityServiceImpl extends SeasonalityService {
    def doSomeForF(): Option[Int] = {
      seasonalityDao.doSomeForB()
    }
    def doSomeForF1(): Int = {
      seasonalityDao.doSomeForB1()
    }
  }
}

【问题讨论】:

  • 问题到底是什么?
  • 如何正确实施 SeasonalityServiceImpl 的模拟测试?在这种情况下,我收到消息:无法模拟/监视类 Main$$anon$1 Mockito 无法模拟/监视以下内容:-最终类-匿名类-原始类型 org.mockito.exceptions.base.MockitoException:...
  • 您应该编辑问题并添加这些错误。人们将更有可能回答。至于问题本身,请使用classOf[SeasonalityService] 而不是seasonality.getClass。这将使用接口,而不是您在下面返回的匿名类。
  • 感谢您的建议!在 classOf[SeasonalityService] 的情况下,我收到: With Option null without Option 0 Returned default values, expected Option(2) and 10
  • 好吧,你忘了模拟那个对象(你在模拟dMock,但在测试hMock

标签: scala mockito


【解决方案1】:

如果我理解正确,您希望在您的模拟中调用 doSomeForBdoSomeForB1。但是您的代码会在您调用它们之前验证此期望,因此测试失败。

此外,您的模拟被定义为本地方法,这意味着在每次调用时您都会获得一个 new 模拟对象。您需要将它们转换为本地 val,以便您交互(并验证)同一个实例。

修改如下:

  test("some test") {
   // this seems unused -->>  def hMock = mock(classOf[SeasonalityServiceImpl])
    val sMock = mock(classOf[SeasonalityDao]) // you need it to be a val, not a def

    when(sMock.doSomeForB()).thenReturn(Option(2))
    when(sMock.doSomeForB1()).thenReturn(10)

    println("With Option " + sMock.doSomeForF()) // note that you should call them on sMock
    println("Without Option " + sMock.doSomeForF1())

    verify(sMock).doSomeForB()
    verify(sMock).doSomeForB1()
  }

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多