2017-09-27 138 views
3

在写我面临着以下异常测试:斯卡拉:模型初始化失败,猫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 li关注此:

trait DataAccessObject[M[_], T <: Entity] 

我很茫然如何修复/正确实施此。任何帮助,将不胜感激。谢谢!

回答

1

尝试

class IOMyDAO(override val transactor: Transactor[IO]) extends MyDAO[IO](transactor) 

val m = mock[IOMyDAO].smart 

在此基础上answer


你应该尝试使用org.mockito.Mockito#when而不是specs2内部梅托德匹配功能:

when(m.createTable) thenReturn IO { Right[Throwable, Int](1) } 

,而不是

m.createTable returns IO { Right[Throwable, Int](1) } 
+1

感谢。没有exacly,现在我得到'java.lang.ClassCastException:codegen.java.lang.Object $ MockitoMock $ 546148877不能转换为cats.effect.IO(null:-1)'。我还会检查其他答案,也许我可以在那里找到一些提示。 –

+0

@RaphaelMäder如果使用'org.mockito.Mockito.mock(..)'而不是'org.specs2.mock.Mockito#mock(..)'它会改变什么吗? 'val m:MyDAO [IO] = org.mockito.Mockito.mock(classOf [MyDAO [IO]],org.mockito.Mockito.RETURNS_SMART_NULLS)'或'val m:IOMyDAO = org.mockito.Mockito.mock classOf [IOMyDAO],org.mockito.Mockito.RETURNS_SMART_NULLS)' –

+1

This works!所以这是我猜测specs2 mockito包的问题。我会在他们的github上创建一个问题。非常感谢你!如果你更新你的答案,我会接受它。 –