【问题标题】:How to mock method in extended trait with Mockito如何使用 Mockito 模拟扩展特征中的方法
【发布时间】:2015-08-20 05:04:11
【问题描述】:

如何使用 mockito 模拟依赖特征? 我有两个特点:

 trait A {
    def a = 1
  }

  trait B extends A {
    def b = {
      // do things
      a
      // do things
    }
  }

现在,我想测试特征 B。我想验证是否调用了 A.a():

class SmallTest extends FunSuite with MockitoSugar {
  test("prove, that a gets called") {
    val mockA = mock[A]
    val b = new B with mockA {}  // This won't compile
    b.b
    verify(mockA).a
  }
}

此示例无法编译。但否则我将如何“注入”我的模拟?

【问题讨论】:

    标签: scala unit-testing mockito scalatest traits


    【解决方案1】:

    使用 spy 会是更好的选择。 mockito spy

    // the class being spied cannot be final,
    // so we cannot do this:
    // spy(new B {})
    
    class C extends B
    
    val c = spy(new C)
    c.b
    verify(c).a
    

    【讨论】:

    • 我有同样的question。 Spys 的问题是他们仍然调用了我在这种情况下不想做的真实代码,因为我要验证的方法与数据库有交互。
    【解决方案2】:

    好的,找到方法了。这将起作用。也许有点不方便,如果有很多方法,我必须覆盖...... 在这个例子中,我在要模拟的方法中添加了方法参数,以显示重复,这看起来不太好。

      trait A {
        def a(i: Int) = i + 1
      }
    
      trait B extends A {
        def b(j: Int) = {
          // do things
          a(j)
          // do things
        }
      }
    
      test("prove, that a gets called") {
        val mockA = mock[A]
        val b = new B {
          override def a(j: Int) = mockA.a(j)
        }
        b.b(1)
        verify(mockA).a(1)
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 2019-01-28
      • 1970-01-01
      • 2020-12-08
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多