В тестировании, почему методы не вызываются как часть выполнения для понимания? - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь выполнить модульное тестирование метода, который использует следующее для понимания (все 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, которые я могу отобразить в одномдействие и выполнение на БД (в этом случае executeTransactionally принимает результат и добавляет .transactionally.asTry к методу db.run.

У меня возникла проблема при тестировании метода, частью которого он является - я хочу проверитьаргументы методов создания, но, несмотря на то, что я буквально повсюду бросаю точки останова и устанавливаю откровенно нелепые таймауты для блока eventually, Mockito.verify () не регистрирует никаких взаимодействий ни с одним из этих методов создания, кроме самого первого вызова aDao.

Честно говоря, похоже, что только методы, необходимые для создания конечного результата для понимания, вызываются, а любые методы "побочного эффекта" игнорируются. Я могу удалить мои фиктивные настройки для всего, кромепервый вызов 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)))
...