如何在使用方面时运行Spring集成测试?

时间:2012-08-02 09:04:20

标签: java spring-mvc spring-aop spring-test

我正在开发一个Spring MVC Web应用程序(目前是Java 6和Spring 3.0.6)。  我开始使用扩展AbstractTransactionalJUnit4SpringContextTests的Junit4编写一些Spring集成测试。我通过Maven构建或EclipseIDE(3.7)调用它们。这些测试调用Controller方法(即,在使用@Controller注释的类中使用@RequestHandler注释的方法)。

一直进展顺利,直到我将基于方面的日志记录添加到控制器中:

    // public controller methods
@Pointcut("execution(public * com.axiope.webapp.controller.*.*(..))")
private void publicControllerMethod() {
}
@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
private void requestHandler(){}

@Pointcut("publicControllerMethod() && requestHandler() ")
private void controllerHandler(){}



// logs contoller exceptions
@AfterThrowing(
        pointcut="controllerHandler()",
        throwing="ex")
      public void logControllerExceptions(Throwable ex) {
    logger = LogFactory.getLog(ex.getClass());
    logger.error("Controller exception !" + ex.getMessage());   
    }

现在,当我通过Maven运行测试时,我得到一个错误:

No unique bean of type [com.axiope.webapp.controller.StructuredDocumentController]
is defined: expected single bean but found 0: 

在测试中,我从setUp方法中的applicationContext加载控制器:

structuredDocumentController = applicationContext.getBean(
    StructuredDocumentController.class);

如果我注释掉这个方面,就不会发生这个错误。我怀疑它与Spring代理控制器有关,然后控制器类无法通过其类名识别。我已经尝试在applicationContext.xml中将控制器声明为bean,但这没有帮助。在Eclipse中运行测试时也会出现此问题,因此我的Maven配置不会出现问题。

我的问题是:如何在测试中检测到控制器bean?

非常感谢任何帮助 - 在控制器类中为方法添加方面是否错误?我应该在测试时以某种方式禁用方面吗? (尽管理想情况下我希望在集成测试中看到日志记录正常工作)。

非常感谢

理查德

1 个答案:

答案 0 :(得分:0)

方面不是可能的问题,您应该能够在控制器中使用它们而没有任何问题。

我的猜测是你没有为测试加载正确的上下文 - 你如何指定用于此测试的应用程序上下文 - 你的测试类上有@ContextConfiguration的位置,是位置到Root上下文(通过ContextLoaderListener指定的一个)或Web应用程序上下文(通过DispatcherServlet指定的一个)。