【问题标题】:Scalamock: How to get "expects" for Proxy mocks?Scalamock:如何获得代理模拟的“期望”?
【发布时间】:2015-07-02 16:34:30
【问题描述】:

我将 Scalamock 与 ScalaTest 一起使用,并试图模拟 Java 接口。我目前有:

private val _iface = mock [MyInterface]

现在我想做

_iface expects `someMethod returning "foo" once

但是编译器没有找到expects

我导入了org.scalatest._org.scalamock.scalatest._。我还缺少什么?

【问题讨论】:

    标签: scala scalatest scalamock


    【解决方案1】:

    首先,ScalaMock 3 对代理 mock 的支持不是很好,我认为 ScalaMock 4 将完全删除它们。你真的需要使用代理 mock 来代替宏 mock吗?

    这应该可行:

    package example
    
    import org.scalatest.FlatSpec
    import org.scalatest.Matchers
    import org.scalamock.scalatest.proxy.MockFactory
    
    trait MyInterface {
        def someMethod : String
    }
    
    class MyTest extends FlatSpec with Matchers with MockFactory {
      "MyInterface" should "work" in {
        val m = mock[MyInterface]
        m.expects('someMethod)().returning("foo")
        m.someMethod shouldBe "foo"
      }
    }
    

    如果没有,请查看ScalaMock proxy mocks unit tests 了解更多示例。

    【讨论】:

    • 这个例子甚至找不到mock。我现在在需要此类功能时坚持使用 Mockito。
    • @rabejens 它没有找到mock,因为在我的示例中没有定义MyInterface。我已经更新了这个例子——它可以编译并与 ScalaMock 3.2.x 一起使用。请注意,我将 ScalaTest 套件与 org.scalamock.scalatest.proxy.MockFactory 混合使用
    • 我尝试用这种技术模拟一个Java接口,即使我导入这个并执行mock[MyInterface],它也找不到mock
    • @rabejens 请仔细检查您的测试。我删除了MyInterface 特征,创建了src/main/java/example/MyInterface.java,将我的测试移至src/test/scala/example/MyTest.scala 并且它可以工作。我正在使用 scala-2.11.1 和 ScalaMock-3.2.2。
    • 我仔细检查了它。我什至复制粘贴了您的代码,但也没有找到mock。也许是因为我正在使用 Maven 构建并且错过了一些依赖项。您为此指定了哪些依赖项?我目前有org.scalatest:scalatest_2.11org.scalamock:scalamock-core_2.11org.scalamock:scalamock-scalatest-support_2.11
    【解决方案2】:

    我认为应该更像:

    import org.scalamock.scalatest.MockFactory
    
    class MyTest extends FlatSpec with Matchers with MockFactory {
      "MyInterface" should "work" in {
        val m = mock[MyInterface]
        (m.someMethod _).expects().returning("foo")
        m.someMethod shouldBe "foo"
      }
    }
    

    我认为期望 arg 期望 arg 到函数

    【讨论】:

      【解决方案3】:

      我使用scalaMock 版本4.1.0,这对我有用:

      对于某些特征:

      trait MyInterface { def someMethod(n1: Int, n2: Int) }
      

      这应该投入测试

      val myInterfaceMock = mock[MyInterface]
      
      myInterfaceMock.someMethod _ expects (1,2)
      

      更多阅读:scalaMock Guide,你会在那里找到一些例子

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-03
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多