首页 > 解决方案 > 在测试中,为什么不将方法作为理解执行的一部分调用?

问题描述

我正在尝试对使用以下内容进行理解的方法进行单元测试(所有 Daos 都是模拟):

val dbAction = for {
  a <- aDao.create(argumentObject.getA)
  b <- bDao.create(argumentObject.getB)
  _ <- cDao.batchCreate(argumentObject.getC)
  d <- argumentObject.getOptionalD.map(dDao.create).getOrElse(DBIOAction.successful(<case class creation here>))
  _ <- argumentObject.getOptionalE.map(eDao.batchCreate).getOrElse(DBIOAction.successful(()))
  _ <- argumentObject.getOptionalF.map(fDao.batchCreate).getOrElse(DBIOAction.successful(()))
} yield a.id
db.executeTransactionally(dbAction).map {
  case Failure(e) => throw new RuntimeException()
  case Success(v) => v
}

DAO 设置为返回 DBIOActions,我可以将其平面映射为单个操作并在 db 上执行(在这种情况下,executeTransactionally 获取结果并添加.transactionally.asTry到 db.run 方法。

我在测试这是其中一部分的方法时遇到问题-我想验证创建方法的参数,但是尽管我在各处都抛出断点并在eventually块上设置了坦率可笑的超时时间,但 Mockito.verify() 不是注册与这些创建方法中的任何一个的任何交互,除了第一个 aDao 调用。

老实说,似乎只调用了创建 for 理解的最终结果所需的方法,而任何“副作用”方法都被忽略了。我可以删除除第一个 aDao 调用之外的所有内容的模拟设置,并且不更改输出。

e:本节的模拟设置:

  when(aDao.create(mockA)) thenReturn DBIOAction.successful(mockA)
  val bCaptor = ArgumentCaptor.forClass[B, B](classOf[B])
  when(bDao.create(bCaptor.capture())(any())) thenReturn DBIOAction.successful(mockB)
  val cCaptor = ArgumentCaptor.forClass[Seq[C], Seq[C]](classOf[Seq[C]])
  when(cDao.batchCreate(cCaptor.capture())(any())) thenReturn DBIOAction.successful(Some(1))
  val fCaptor = ArgumentCaptor.forClass[Seq[F], Seq[F]](classOf[Seq[F]])
  when(fDao.batchCreate(fCaptor.capture())(any())) thenReturn DBIOAction.successful(Some(2))
  when(dao.executeTransactionally(isA(classOf[DBIOAction[Long, NoStream, Effect.All]]))).thenReturn(Future(Success(1L)))

标签: scalamockitoslickscalatest

解决方案


推荐阅读