scala - 在测试中,为什么不将方法作为理解执行的一部分调用?
问题描述
我正在尝试对使用以下内容进行理解的方法进行单元测试(所有 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)))
解决方案
推荐阅读
- python - Tensorflow ValueError:层“顺序”的输入0与层不兼容:预期形状=(无,20,20,3),发现形状=(无,20,3)
- reactjs - 如何先更新 updateNotes 然后再更新 getNotes?
- node.js - 运行 npm run dev 后如何响应错误信息?
- javascript - 使用 vue 预加载插件为给定组件预加载图像
- javascript - 飞溅后反应原生白屏,直到我更改代码
- django - DRF:从数据库查询中以编程方式设置 ChoiceField 默认值
- python - 如何使用 pandas 数据框连接多个列的列值在一定范围内的两个数据框?
- frontend - WordPress中的自定义滑块
- r - 计算具有数值和逻辑变量的相关矩阵
- javascript - 如何使用 Steam Oath 2.0 实施