首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Mockito进行Scala试验

用Mockito进行Scala试验
EN

Stack Overflow用户
提问于 2014-07-03 14:54:11
回答 1查看 2.5K关注 0票数 0

我是斯卡拉的新人。目前,我正在进行一项模拟特性测试。有人能帮我实现吗?我想模拟特性seasonalityDao.doSomeForB和测试方法hMock.doSomeForF()中的方法SeasonalityServiceImpl和hMock.doSomeForF()。

更新:我已经根据下面的评论更正了代码。在本例中,当我试图对模拟的方法验证(SMock)、.doSomeForB()验证(SMock).doSomeForB1()进行验证时,我会收到下一个错误: seasonalityDao.doSomeForB();->在主$anonfun$1中使用$mcV$sp(Main.scala:12)--实际上,与这个模拟没有任何交互。

下面是一个代码(我刚刚简化了项目的重要部分,举个例子):

代码语言:javascript
复制
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()
    }
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-04 10:28:23

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

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

修改为如下所示:

代码语言:javascript
复制
  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()
  }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24557046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档