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