2

我有一个 Spring Boot 项目,其中一位开发人员针对内存数据库编写了集成测试。在我提出问题之前,这里有一些背景知识:
我们有以下 Maven 模块:
1) web-persistence:存储所有实体和接口以及相应的实现。所有这些类都在 package 中com.mycompany.persistence
2) web-services:它存储了我们所有的rest控制器和spring security相关的类。这些都在包com.mycompany.services
3) web-services 模块对 web-persistence 模块有 maven 模块依赖。
4) 在 web-services 模块中,我们定义了一个服务UserContextServiceImpl,它是接口的实现IUserContextService. 该服务基本上封装了 Spring 的 SecurityContextHolder 功能,只公开其方法所需的当前用户相关信息的那些部分,这样我们就不必在任何地方使用 SecurityContextHolder。实现类使用@Service("userContextService") 进行注释。
5) 接口IUserContextService在持久化模块中。持久性模块中还有另一个类,它通过在应用程序初始化时调用where is holdingAppDependecyHeper来实现并返回 UserContextService 的具体实例。ApplicationContextAwareappContext.getBean('userContextService')appContextApplicationContext
6) 现在我们不想在持久性模块中公开 Spring Security 类(因为这里没有上下文),因此上面的安排是通过调用getBean() method of applicationContext持久层类来通过服务获取当前用户信息AppDependencyHelper。然后使用此信息更新审计字段 createdBy 和 modifiedBy 使用EntityListener.
7) 实际应用程序仅使用单个ApplicationContext,其中持久层类和 Web 控制器都加载在一个 Spring 上下文中。
8) 应用程序运行时一切正常。但是,当我们的集成测试运行时,调用appContext.getBean('userContextService')失败并抛出NosuchBeanDefinitionException,因为它无法找到名为“userContextService”的 bean
9)现在最后是位于com.mycompany.persistence.embeddeddb包中的集成测试代码(仅给出相关细节):

  @Runwith(SpringJUnit4ClassRunner.class)
  @ConfigurationContext 
  class MyEntityTest{

        @Configuration
        @ComponentScan("com.mycompany.persistence")  
        public static class Config{
              .....
        }
        .....//code which eventually gives call to  
        AppDependencyHelper's method which in turn tries to retrieve userContextService Bean.
  }

现在的问题:
1)为什么它无法检索bean?我尝试添加com.mycompany.services如下

@ComponentScan({"com.mycompany.persistence","com.mycompany.services"})
但无济于事。
2)通过阅读我得到的任何内容,我能够理解的是,@ContextConfiguration需要提供 XML 文件或带注释的类或 WebApplicationInitializers(在我的情况下,因为我们只有一个 ApplicationContext)才能ApplicationContext从 @Configuration 类创建一个。但是我不能这样做,因为 maven 开始抱怨循环依赖,这是正确的,因为我的@Service注释类 UserContextServiceImpl位于 web-services 模块中,该模块依赖于已经编写测试用例类的 web-persistence 模块。
3) 我能想到的唯一解决方案是将所有集成测试类移动到 web-services 模块,这样我就可以告诉@ConfigurationContext它应该从中创建的所有类。ApplicationContext对吗?

最后一点:当我运行测试时,ApplicationContext该类是类型。GenericApplciationContext当我运行应用程序时,它显然AnnotatedEmbeddedWebApplicationContext

请让我知道是否有解决此问题的方法?

4

1 回答 1

1

根据我的猜测,您正在尝试在集成测试中使用 Web 服务模块中的组件。如果是这种情况,那么,您应该将集成测试用例移至您的 Web 服务模块 - 正如您在问题中已经建议的那样。

编辑:你真的应该重新考虑你的设计,因为你在这里有一个循环依赖问题:你的web-service模块依赖于web-persistence,但是你的IUserContextServicein的实现web-persistence是在web-service.

您可能应该将您的IUserContextService(和所有集成测试)移动到您的web-service包中。

于 2015-12-20T21:14:22.793 回答