@ContextConfiguration({"/spring/applicationContext.xml"}) public class SprintTestngWithSpyAnnotationITCase extends AbstractTestNGSpringContextTests { //this bean will take mocked objects injected into it, but it itself is not going to be mocked @InjectMocks @Resource SomeService someService; //it equals to one that is created via spy(applicationContext.getBean(SomeDAO.class)) and it will be // injected to "someService" above @Spy @Resource SomeDAO someDAO; @BeforeMethod public void beforeMethod() { /** * Do the spy(someDAO) and inject spied objects to someService .
* Note that If you put initMocks() inside @BeforeTest, then someDAO will be created with its * constructor instead of spring spawning because during @BeforeTest the application context is * still null *
* * This thing will also do reset() inside it so you don't have to call reset() explicitly */ MockitoAnnotations.initMocks(this); } @Test public void testServe_BehaviorChanged() { Mockito.doReturn("New Value").when(someDAO).access(); Assert.assertEquals(someService.serve(), "New Value"); } @Test (dependsOnMethods = "testServe_BehaviorChanged" ) public void testServe_BehaviorNotChanged() { Assert.assertEquals(someService.serve(), "Original Value"); } }