【问题标题】:Scala Mock Syntax (class _).expects meaning? [duplicate]Scala Mock Syntax (class _).expects 是什么意思? [复制]
【发布时间】:2018-05-15 00:07:47
【问题描述】:

刚接触 Scala,为了澄清一些 ScalaMock 语法而进行了广泛的搜索。根据this guide,我不断看到以下一般测试模式:

(myClass.myMethod _).expects()

这里到底发生了什么?类/方法/空格/下划线有什么作用?编译器是怎么处理的?

【问题讨论】:

    标签: scala unit-testing mocking scalamock


    【解决方案1】:

    附加的_ 强制将方法转换为函数。

    为了理解为什么这是必要的,让我们尝试重新构建一小块 Scalamock,即expects 方法。 expects 方法似乎是在模拟对象的方法上调用的。但是方法/函数没有 expects 方法开始。因此,我们必须使用“pimp my library”模式将方法expects 附加到函数。我们可以这样做:

    implicit class ExpectsOp[A, B](f: A => B) {
      def expects(a: A): Unit = println("it compiles, ship it...")
    }
    

    现在让我们用方法baz定义一个类Bar

    class Bar {
      def baz(i: Int): Int = i * i
    }
    

    也是Bar的一个实例:

    val bar = new Bar
    

    让我们看看如果你尝试在bar.baz 上调用expects 会发生什么:

    (bar.baz).expects(42)
    

    错误:Bar 类中的方法 baz 缺少参数列表 只有在需要函数类型时,未应用的方法才会转换为函数。您可以通过编写 baz _baz(_) 而不是 baz 来明确此转换。

    因此,如果不显式转换为函数,它就无法工作,我们必须通过附加 _ 来强制执行此转换:

    (bar.baz _).expects(42) // prints: "it compiles, ship it..."
    

    【讨论】:

    • 非常感谢!这正好回答了我的问题。
    猜你喜欢
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2017-04-05
    • 2012-02-07
    • 2016-10-25
    • 2016-03-28
    • 2012-11-28
    相关资源
    最近更新 更多