scalaunit-testingscalatestscalamock

Mock a method without arguments but with implicit parameters


abstract trait MyApi {

  def getResult()(implicit ec: ExecutionContext): Future[String]

}

The following doesn't work:

val m = mock[MyApi]
(m.getResult _).expects() returning "..."

It fails with:

java.lang.ClassCastException: org.scalamock.MockFunction1 cannot be cast to org.scalamock.MockFunction0

Note: the example given in http://scalamock.org/user-guide/advanced_topics/ is only useful if the method has at least one argument. So we can't use the solution as in mocking methods which use ClassTag in scala using scalamock


Solution

  • You didn't look at the right example, I guess. Look at example 4 for implicit parameters:

    class Codec()
    
    trait Memcached {
      def get(key: String)(implicit codec: Codec): Option[Int]
    }
    
    val memcachedMock = mock[Memcached]
    
    implicit val codec = new Codec
    (memcachedMock.get(_ : String)(_ : Codec)).expects("some_key", *).returning(Some(123))
    

    In your case, of course, the non-implicit params are null, so you want:

    (m.getResult()(_: ExecutionContext)).expects(*) returning "..."