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

scala-单元测试-如何在类中模拟类方法

  •  1
  • tim tim  · 技术社区  · 7 年前

    我在Scala中有一个类,如下所示:

    class A {
      private val b = new B()
    
      def doSomething() {
        b.someMethod();
      }
    }
    

    如何进行单元测试 doSomething() ?我怎么能嘲笑 b 在这里

    我试过这样的方法:

    val b = mock[B]
    when(b.someMethod()).thenReturn(xx)
    val class_to_test = new A()
    class_to_test.doSomething()
    

    我用的是Mockito和MockitoSugar。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Brian McCutchon    7 年前

    上一段代码的问题是 val b = mock[B] 是与 b 你们班的字段。您可以通过修改类来解决此问题 B 作为可选参数:

    class A(b: B = new B) {
      def doSomething(): Unit = {
        b.someMethod()
      }
    }
    

    现在您的测试变成:

    val b = mock[B]
    when(b.someMethod()).thenReturn(xx)
    val classToTest = new A(b)
    classToTest.doSomething()
    

    这种技术被称为 依赖项注入 。您可以在此处阅读更多信息: What is dependency injection?


    如果你不想暴露 B 作为公共构造函数参数,您可以使用包私有构造函数与公共构造函数或工厂方法结合使用,该方法提供的默认值为 B :

    class A private[myPackage](b: B) {
      def this() = this(new B)  // The public constructor doesn't expose b.
    
      def doSomething(): Unit = {
        b.someMethod()
      }
    }
    

    然后确保您的测试在同一个包中,这样他们仍然可以调用 B