2017-09-27 9 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

answer을 바탕으로

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

val m = mock[IOMyDAO].smart 

을보십시오.


당신은 org.mockito.Mockito#when 대신 specs2의 내부 metod 매칭 기능을 사용하려고합니다

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.specs2.mock.Mockito # mock (..) '대신'org.mockito.Mockito.mock (..)'을 사용하면 아무 것도 바뀌나요? (MyOMAID) : org.mockito.Mockito.mock (org.mockito.Mockito.Mockito.mock (org.mockito.Mockito.MET)) '또는'val m : IOMyDAO = org.mockito.Mockito.mock classOf [IOMyDAO], org.mockito.Mockito.RETURNS_SMART_NULLS) ' –

+1

이 작동합니다! 내가 생각하기에 specs2 mockito 패키지의 문제입니다. 나는 그들의 github에 대한 문제를 만들 것입니다. 대단히 감사합니다! 대답을 업데이트하면 받아 들일 것입니다. –