我正在开发一个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?
非常感谢任何帮助 - 在控制器类中为方法添加方面是否错误?我应该在测试时以某种方式禁用方面吗? (尽管理想情况下我希望在集成测试中看到日志记录正常工作)。
非常感谢
理查德
答案 0 :(得分:0)
方面不是可能的问题,您应该能够在控制器中使用它们而没有任何问题。
我的猜测是你没有为测试加载正确的上下文 - 你如何指定用于此测试的应用程序上下文 - 你的测试类上有@ContextConfiguration
的位置,是位置到Root上下文(通过ContextLoaderListener指定的一个)或Web应用程序上下文(通过DispatcherServlet指定的一个)。