0

我正在开发一个 Spring MVC Web 应用程序(目前是 Java 6 和 Spring 3.0.6)。我开始使用扩展 AbstractTransactionalJUnit4SpringContextTests 的 Junit4 编写一些 Spring 集成测试。我通过我们的 Maven 构建或在 EclipseIDE (3.7) 中调用这些。这些测试调用控制器方法(即,在使用@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?

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

非常感谢

理查德

4

1 回答 1

0

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

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

于 2012-08-02T12:16:07.887 回答