【问题标题】:Unit testing with AspectJ in Java在 Java 中使用 AspectJ 进行单元测试
【发布时间】:2014-08-29 11:58:48
【问题描述】:

我正在开发一个将 AspectJ 与 Java 结合使用的应用程序。在开发中,我将ajc和java结合使用。 AspectJ 在必要时调用了一些代码段,我想测试这些由 AspectJ 调用的代码段。我尝试用 Mockito 来做,但失败了,有人知道其他方法来测试它吗?

【问题讨论】:

标签: java unit-testing aspectj-maven-plugin


【解决方案1】:

我不确定如何在普通 JavaJUnit 中执行此操作,但如果您可以访问 Spring-Integration-Test您可以轻松地使用 MockMVC 并支持它提供的类。

您可以在下面看到一个示例,在该示例中,我正在测试一个控制器,该控制器周围有一个 Aspect

@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();
        }

    }

}

即使您的应用程序中没有配置 Spring,您也可以使用上述方法,因为我使用的方法将允许您拥有一个配置类(可以而且应该是公共类驻留在它自己的文件中)。

如果@Configuration 类被@EnableAspectJAutoProxy(proxyTargetClass = true) 注释,Spring 将知道它需要在您的测试/应用程序中启用方面。

如果您需要任何额外的说明,我会提供进一步的编辑。

编辑:

Maven Spring-Test 依赖是:

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
</dependency>

【讨论】:

  • 好吧,我不喜欢 Spring 框架,但我尝试了你的方式。首先,需要 spring-webmvc 作为另一个依赖项,因为无法导入 WebAbblicationContext。即使这样,也没有 MongoAuditingAspect 类。正如我所说,我不是很喜欢 Spring 框架,所以这些可能是虚拟类,我不知道。感谢您的帮助,但是当我与 Spring 无关时,我希望找到一种测试代码的好方法 :)
  • MongoAuditingAspect 是一个方面的例子 :) 抱歉,我忘了说
【解决方案2】:

我刚刚创建了一个 JUnit4 Runner 以允许在 JUnit 测试用例上进行 AspectJ 加载时间编织。这是一个简单的例子:

我创建了一个 HelloService 来返回问候语。我创建了一个 Aspect 来以大写问候语命名。最后,我创建了一个单元测试来使用带有小写名称的 HelloService,并期望得到大写的结果。

示例的所有细节都是GitHub项目的一部分供参考: https://github.com/david-888/aspectj-junit-runner

只需在您的类路径中包含最新的aspectj-junit-runner JAR。那么您的测试可能如下所示:

@AspectJConfig(classpathAdditions = "src/test/hello-resources")
@RunWith(AspectJUnit4Runner.class)
public class HelloTest {

    @Test
    public void getLiveGreeting() {
        String expected = "Hello FRIEND!";
        HelloService helloService = new HelloService();
        String greeting = helloService.sayHello("friend");
        Assert.assertEquals(expected, greeting);
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    相关资源
    最近更新 更多