Spring Aspect не запускается в модульном тесте
Хорошо, мы говорим о Spring (3.2.0) MVC
У нас есть точка, определенная для запуска «вокруг» аннотации, например:
@Around("@annotation(MyAnnotation)")
public void someFunction() {
}
Тогда в контроллере имеем:
@Controller
@Component
@RequestMapping("/somepath")
public class MyController {
@Autowired
private MyService service;
...
@MyAnnotation
@RequestMapping(value = "/myendpoint", method = RequestMethod.POST, produces = "application/json")
@ResponseBody
public Object myEndpoint(@RequestBody MyRequestObject requestObject, HttpServletRequest request, HttpServletResponse response) {
...
return service.doSomething(requestObject);
}
}
Затем у нас есть модульный тест, который выглядит так:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"../path/to/applicationContext.xml"})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
public class MyControllerTest {
private MockMvc mockMvc;
@InjectMocks
private MyController controller;
@Mock
private MyService myService;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}
@Test
public void myTest() {
MyRequest request = new MyRequest();
MyResponse response = new MyResponse();
String expectedValue = "foobar";
Mockito.when(myService.doSomething((MyRequest) Mockito.any())).thenReturn(response);
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.post("/myendpoint");
String request = IOUtils.toString(context.getResource("classpath:/request.json").getURI());
builder.content(request);
builder.contentType(MediaType.APPLICATION_JSON);
mockMvc.perform(builder)
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.someKey").value(expectedValue));
Mockito.verify(myService, Mockito.times(1)).doSomething((MyRequest) Mockito.any());
}
}
Тест выполняется нормально, но аспект, определенный вокруг аннотации (MyAnnotation), не выполняется. Это выполняется очень хорошо, когда конечная точка запускаетсяреальный запрос (например, при запуске в контейнере сервлета), но просто не срабатывает при запуске в тесте.
Это особая «особенность» MockMvc, которая не запускает аспекты?
К вашему сведению наше applicationContext.xml настроено с:
<aop:aspectj-autoproxy/>
и, как я уже говорил, аспекты действительно работают в реальности, а не в тесте.
Кто-нибудь знает, как запустить эти аспекты?
Спасибо!