我有一个 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 的具体实例。ApplicationContextAware
appContext.getBean('userContextService')
appContext
ApplicationContext
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
请让我知道是否有解决此问题的方法?