Как сделать, чтобы у специализированного типа был метод, который принимает Function1? - PullRequest
0 голосов
/ 03 июня 2018

У меня есть следующий класс:

class Elem[T](t: T){
  def doSome(f: T => Unit):Unit = f(t)
}

Итак, я хочу проверить вызов функции для данного экземпляра Elem (я делаю с mockito).При выполнении теста

val f = mock(classOf[Int => Unit])
new Elem(1).doSome(f)
verify(f).apply(1)

я получил следующее исключение:

Wanted but not invoked:
function1.apply$mcVI$sp(1);

However, there was exactly 1 interaction with this mock:
function1.apply(1);

Это разумно, поскольку Function1 специализируется на Int.Так что выполнение теста как

val f = mock(classOf[AnyRef => Unit])
new Elem(1.asInstanceOf[AnyRef]).doSome(f)
verify(f).apply(1.asInstanceOf[AnyRef])

работает нормально.

Есть ли способ избежать этого уродливого приведения к AnyRef?Может быть, есть другой инструмент, более подходящий для этого случая, чем mockito?

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

ScalaMock , кажется, работает "из коробки":

import org.scalatest._
import org.scalatest.matchers._
import org.scalamock.scalatest.MockFactory
import org.scalamock.scalatest._

class Elem[T](t: T){
  def doSome(f: T => Unit):Unit = f(t)
}

class ExampleSpec extends FlatSpec with Matchers with MockFactory {

  "Elem.doSome" should "apply given function once" in {
    val f = mockFunction[Int, Unit]
    f.expects(1).returning({}).once
    new Elem(1).doSome(f)
  }
}

run(new ExampleSpec)
0 голосов
/ 03 июня 2018

Вот один из способов заставить компилятор использовать неспециализированный универсальный apply:

  def verifyGenericApply[X, Y](f: X => Y, x: X): Unit = {
    verify(f).apply(x)
  }

  "Int function" should "invoke non-specialized apply" in {
    class Elem[T](t: T){
      def doSome(f: T => Unit):Unit = f(t)
    }
    val f = mock(classOf[Int => Unit])
    new Elem(1).doSome(f)
    verifyGenericApply(f, 1)
  }

Я не достаточно знаком с mockito, чтобы гарантировать, что это идиоматично...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...