【问题标题】:How to run Spring integation tests when using aspects?使用方面时如何运行 Spring 集成测试?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 - 是的,上下文配置指向所有必需的 Spring 配置文件。例如,@ContextConfiguration(locations = {"classpath:/applicationContext-resources.xml", "classpath:/applicationContext-dao.xml", "classpath:/applicationContext-service.xml", "classpath:/applicationContext-test.xml ", "/WEB-INF/applicationContext*.xml", "/WEB-INF/dispatcher-servlet.xml"})
    • 只是补充一点,这些文件是在 web.xml 的 contextConfigLocation servlet 上下文参数中指定的
    • 哦,1 个问题,你是使用 AspectJ 编译时间/加载时间编织还是使用带有 @AspectJ 样式注释的 Spring AOP。你是对的,控制器的代理可能是导致问题的原因 - 你是否从某个接口/抽象类派生你的控制器?
    • Spring AOP AspectJ 注释。控制器没有实现任何接口(控制器注解都在实现方法上)。
    • 我无法重现您所看到的行为 - 您可以尝试一件事 - 而不是 AbstractTransactionalJUnit4SpringContextTests,您可以尝试使用 @RunWith(SpringJunit4Runner.class)@ContextConfiguration 与您之前和在您指定的内容班级@Autowired StructuredDocumentController documentController
    猜你喜欢
    • 2020-02-10
    • 2017-06-22
    • 2015-02-10
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2017-10-30
    相关资源
    最近更新 更多