0

我在 scala 对象中有一些函数。这些函数在内部调用同一对象的其他函数。

object A {

    def method1:Unit= {
        spark=CreateSparkSession.create()
        Method2(spark,dbnm)
    }

    def Method2(spark:Sparksession, dbnm:String):Unit= {
        //some implementation 
    }
}

如何在不实际调用 method2 的情况下为 Method1 编写单元测试用例。

CreateSparksession 是另一个具有返回 sparksession 的 create 方法的对象。

4

1 回答 1

0

您不能模拟对象中的方法。而且你不应该在你正在测试的类中模拟方法(如果看起来你需要,这是违反单一责任原则的明确症状)。

你可以做的是这样的:

    trait Api1 {
       def method1(
         ...
      ): Unit // NB: also, should not really return a Unit: how are you going to test this???
    }
    
    trait Api2 { 
       def method2(...): Unit // See above  
    }

    class Impl2 extends Api2 { 
       def method2(...) = // Do stuff 
    }

    class Impl1(val api2: Api2) extends Api1 { 
        def method1(...) = { ... ; api2.method2(); ... }
    }

    // You should not really need this, but, you can have it if you want
    object A extends Impl1(new Impl2)

所以,现在测试这段代码很简单:

     describe("Impl2") {
       it ("does nothing") {
          new Impl2().method2("foo") 
          // Nothing happens
          // this is what I meant: how do you know it worked?
        }
     }

     describe("Impl1") { 
       it ("does nothinig") {
         val a2 = mock[Api2] 
         doNothing when a2 method2(any)
         val fixture = new Impl1(a2)
     
         fixture.method1()
         // Again, nothing happens!

         verify(a2).nothing("foo")
     }
于 2022-03-02T11:03:33.363 回答