Mocking nested objects with mockito
Yes, I know its a code smell. But I live in the real world, and sometimes you need to mock nested objects. This is a scenario like:
when(a.b.c.d).thenReturn(e)
The usual pattern here is to create a mock for each object and return the previous mock:
val a = mock[A] val b = mock[B] val c = mock[C] val d = mock[D] when(a.b).thenReturn(b) when(b.c).thenReturn(c) when(c.d).thenReturn(d)
But again, in the real world the signatures are longer, the types are nastier, and its never quite so clean. I figured I’d sit down and solve this for myself once and for all and came up with:
import org.junit.runner.RunWith import org.mockito.Mockito import org.scalatest.junit.JUnitRunner import org.scalatest.{FlatSpec, Matchers} @RunWith(classOf[JUnitRunner]) class Tests extends FlatSpec with Matchers { "Mockito" should "proxy nested objects" in { val parent = Mocks.mock[Parent] Mockito.when( parent. mock(_.getChild1). mock(_.getChild2). mock(_.getChild3). value.doWork() ).thenReturn(3) parent.value.getChild1.getChild2.getChild3.doWork() shouldEqual 3 } } class Child3 { def doWork(): Int = 0… Read more