Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unit testing with AspectJ in Java

I'm developing an application which uses AspectJ with Java. In development, I use ajc and java together. AspectJ calls some code segments when necessary and I want to test these code segments called by AspectJ. I tried to do it with Mockito but I failed, does anyone know any other way to test it?

like image 260
mtyurt Avatar asked Jul 19 '26 14:07

mtyurt


1 Answers

I am not sure on how to do it in plain Java and JUnit, but if you have access to Spring-Integration-Test you can have an easy approach with the MockMVC and support classes that it offers.

And bellow you can see an example in which I am testing a controller that has an Aspect wrapped around it:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration
public class ControllerWithAspectTest {

    @Autowired
    private WebApplicationContext wac;
    @Autowired
    private MockMvc mockMvc;

    @Autowired
    @InjectMocks
    private MongoController mongoController;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
        // if you want to inject mocks into your controller
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testControllerWithAspect() throws Exception {
        MvcResult result = mockMvc
                .perform(
                        MockMvcRequestBuilders.get("/my/get/url")
                                .contentType(MediaType.APPLICATION_JSON)
                                .accept(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
    }

    @Configuration
    @EnableWebMvc
    @EnableAspectJAutoProxy(proxyTargetClass = true)
    static class Config extends WebMvcConfigurerAdapter {

        @Bean
        public MongoAuditingAspect getAuditingAspect() {
            return new MongoAuditingAspect();
        }

    }

}

You can use the approach above even if you don't have Spring configured in your application, as the approach I've used will allow you to have a configuration class (can and should be a public class residing in it's own file).

And if the @Configuration class is annotated with @EnableAspectJAutoProxy(proxyTargetClass = true), Spring will know that it needs to enable aspects in your test/application.

If you need any extra clarification I will provide it with further edits.

EDIT:

The Maven Spring-Test dependency is:

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
</dependency>
like image 170
Bogdan Emil Mariesan Avatar answered Jul 22 '26 05:07

Bogdan Emil Mariesan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!