Mockito-Mock functions within scala object for unit testing

612 views Asked by At

I have a few functions within a scala object. The functions internally call other functions of the same object.

object A {

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

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

How can I write Unit testcase for Method1 without actually invoking method2.

CreateSparksession is another object with create method that returns sparksession.

1

There are 1 answers

6
Dima On

You cannot mock methods in an object. And you should not mock methods in class that you are testing (if it looks like you need to, it is a definite symptom of violating the single responsibility principle).

What you can do is something like this:

    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)

So, now testing this code is trivial:

     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")
     }