代码之家  ›  专栏  ›  技术社区  ›  Some Name

如何使非专用类型具有接受函数1的方法?

  •  2
  • Some Name  · 技术社区  · 7 年前

    我有以下课程:

    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 回复  |  直到 7 年前
        1
  •  4
  •   Andrey Tyukin    7 年前

    下面是一种强制编译器使用非专用泛型的方法 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 为了保证这是惯用的,尽管…

        2
  •  2
  •   Mario Galic    7 年前

    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)
    
    推荐文章