Spring Aspect not triggered in unit test

后端 未结 1 1586
谎友^
谎友^ 2021-01-19 23:34

OK, we\'re talking Spring (3.2.0) MVC

We have an pointcut defined to be triggered \"around\" an annotation like so:

@Around(\"@annotation(MyAnnotatio         


        
相关标签:
1条回答
  • 2021-01-19 23:58

    OK.. so the solution eventually presented itself from.. you guessed it.. reading the documentation :/

    http://docs.spring.io/spring-framework/docs/3.2.0.BUILD-SNAPSHOT/reference/htmlsingle/#spring-mvc-test-framework

    Furthermore, you can inject mock services into controllers through Spring configuration, in order to remain focused on testing the web layer.

    So the final solution looks like this:

    @RunWith(SpringJUnit4ClassRunner.class)
    @WebAppConfiguration
    @ContextConfiguration(locations = {"testContext.xml","../path/to/applicationContext.xml"})
    @TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
    public class MyControllerTest {
    
        private MockMvc mockMvc;
    
        @Autowired
        private WebApplicationContext wac;
    
        @Autowired
        private MyService myService;    
    
        @Before
        public void setup() {
            this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).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());
        }
    }
    

    Then you simply define a context file for this test testContext.xml that has the mock of the service object:

    <bean id="myService" class="org.mockito.Mockito" factory-method="mock">
        <constructor-arg value="com.mypackage.MyService"/>
    </bean>
    

    Importantly the MyService instance is @Autowired into the test so it can be orchestrated.

    This allows you to mock out any instances you like, whether they are in service classes, aspects etc as long as you name the bean appropriately. So in this case the MyService would be declared as:

    @Component("myService")
    public class MyService {
    ...
    
    0 讨论(0)
提交回复
热议问题