I have a requirement where i want to mock an object that is return from private method. I am working with junit and mockito in my project. I can not paste the actual code here but sample code will look like this. Limitation here is that the code is legacy one and I can not refactor as of now
Class to test
public class TestService { public String test() { TestDao testDao = getDaoObject(); int num = testDao.getData(); if (num < 10) { return "hey you loose"; } else { return "hey you win"; } } private TestDao getDaoObject() { return new TestDao(); } }
Dao Class
public class TestDao { public int getData() { return 5; } }
Test class
public class JUnitServiceTestExample { @Test public void test() { TestDao testDao = Mockito.mock(TestDao.class); TestService test = new TestService(); when(testDao.getData()).thenReturn(20); assertEquals(test.test(), "hey you win"); } }
Please help
Advertisement
Answer
You could slightly modify the getDaoObject
from private
to package-private
like below:
TestDao getDaoObject() { return new TestDao(); }
Then use Mockito.spy(new TestService())
to stub the getDaoObject()
and return your mocked testDao
.
public class JUnitServiceTestExample { @Test public void test() { TestDao testDao = Mockito.mock(TestDao.class); TestService test = Mockito.spy(new TestService()); when(testDao.getData()).thenReturn(20); doReturn(testDao).when(test).getDaoObject(); String result = test.test(); assertEquals("hey you win", result); } }
And a tip for you: the correct usage of assertEquals
is assertEquals(expected, actual)
not assertEquals(actual, expected)