5
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

Community
  • 1
  • 1
douglaz
  • 1,306
  • 2
  • 13
  • 17

2 Answers2

13

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 "..."
Ed Staub
  • 15,480
  • 3
  • 61
  • 91
  • The solution is: (m.getResult()(_: ExecutionContext)).expects(*) returning "...", if you update your answer I will accept it. – douglaz May 26 '15 at 22:04
1

Just to complete the cases. If someone tries to do the same with more params the snippet is the following:

trait MemcachedV2 {
   def get(key: String, value: String)(implicit codec: Codec): Option[Int]
}

val memcachedMock2 = mock[MemcachedV2]

(memcachedMock2.get(_, _)(_))
   .expects("some_key","another value", *)
   .returning(Some(123))
eliax1996
  • 108
  • 9