代码之家  ›  专栏  ›  技术社区  ›  ssgao

用Scala Self-Type/Parfait模式模仿

  •  1
  • ssgao  · 技术社区  · 6 年前

    我使用的冻糕图案如下:

    trait A {
      def a: Future[String]
    }
    
    class B {
      this: A =>
    
      def get: Future[String] = a
    }
    

    我想创建一个嘲弄版本 A 所以我可以控制 def a B ,有办法吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   sarveshseri    6 年前

    在测试类时 X 它使用类的实例 Y ,我们通常提供类的模拟实例 .

    给你,你的 B 没有使用的任何实例 A ,它期望(强迫)任何东西 B 也延伸 A .

    同时,你会注意到你的班级 B 有点不完整。如果选择创建 B ,

    val b = new B
    // <console>:13: error: class B cannot be instantiated because it does not conform to its self-type B with A
    //       val b = new B
    

    所以。基本上,每当您创建 B A .

    scala> val b = new B with A { def a = Future.successful("well") }
    // b: B with A = $anon$1@11ad095c
    

    请注意,无论何时创建 B .

    您可以通过这种方式为您的测试用例提供所需的任何东西。

    trait AWithMockedBehaviour1 extends A {
      def a = Future.successful("mocked_1")
    }
    
    val b = new B with AWithMockedBehaviour1