2017-09-27 182 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上創建一個問題。非常感謝你!如果你更新你的答案,我會接受它。 –