Scala: Mock init завершается неудачно с параметром типа Cats IO
При написании тестов я сталкиваюсь со следующим исключением:
java.lang.ClassCastException: codegen.java.lang.Object$MockitoMock$641592186 cannot be cast to cats.effect.IO (MyRepositorySpec.scala:19)
Что происходит при запуске этого тестового кода с specs2
:
class MyRepositorySpec extends Specification with Mockito with TestData {
...
val m = mock[MyDAO[IO]].smart
m.createTable returns IO { Right[Throwable, Int](1) } // <- this is line 19
val r = new MyRepository[IO](m)
r.setup.unsafeRunSync() must beNone
...
}
MyDAO
выглядит так:
class MyDAO[M[_] : Monad](val transactor: Transactor[M])(implicit val AE: ApplicativeError[M, Throwable]) extends DataAccessObject[M, MyObject]
и DataAccessObject
как это:
trait DataAccessObject[M[_], T <: Entity]
Я в растерянности, как это исправить / правильно реализовать. Любая помощь будет оценена. Спасибо!
1 ответ
Решение
Пытаться
class IOMyDAO(override val transactor: Transactor[IO]) extends MyDAO[IO](transactor)
val m = mock[IOMyDAO].smart
На основании этого ответа.
Вы должны попытаться использовать org.mockito.Mockito#when
вместо specs2
Внутренняя функциональность соответствия методов:
when(m.createTable) thenReturn IO { Right[Throwable, Int](1) }
вместо
m.createTable returns IO { Right[Throwable, Int](1) }