【发布时间】:2012-08-02 20:16:07
【问题描述】:
我正在开发一个 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?
非常感谢任何帮助 - 在控制器类的方法中添加方面是错误的吗?我应该在测试时以某种方式禁用方面吗? (虽然理想情况下我希望在集成测试中看到日志记录工作正常)。
非常感谢
理查德
【问题讨论】:
标签: java spring-mvc spring-aop spring-test