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) }
Другие вопросы по тегам