First you need to use webAppContextSetup, as Jason suggested:
@Autowired private WebApplicationContext webApplicationContext; @Before public void setUp() throws Exception { ... mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); }
At this point, the aspect should be launched, but Mockito will not introduce layouts. This is because Spring AOP uses a proxy object and layouts are embedded in this proxy object instead of a proxy object. To fix this, you must expand the object and use ReflectionUtils instead of the @InjectMocks annotation:
private MockMvc mockMvc; @Mock private RoleService roleService; private UserController userController; @Autowired private WebApplicationContext webApplicationContext; @Before public void setUp() { MockitoAnnotations.initMocks(this); UserController unwrappedController = (UserController) unwrapProxy(userController); ReflectionTestUtils.setField(unwrappedController, "roleService", roleService); mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } ... public static final Object unwrapProxy(Object bean) throws Exception { if (AopUtils.isAopProxy(bean) && bean instanceof Advised) { Advised advised = (Advised) bean; bean = advised.getTargetSource().getTarget(); } return bean; }
At this point, any call to when (...). ThenReturn (...) should work correctly.
This is explained here: http://kim.saabye-pedersen.org/2012/12/mockito-and-spring-proxies.html
user3527787
source share