在我正在进行的项目中,我们有一些旧的依赖项,定义了它们自己的 Spring Beans,但需要从主应用程序进行初始化。所有这些 Bean 都是使用 Spring Profiles 构建的,即对于生产代码是“default”,对于测试代码是“test”。我们希望不再使用 Spring Profiles,而是简单地使用 @import 显式地连接我们的上下文。
这个想法是封装所有这些旧的依赖项,使得其他组件不需要关心 Spring Profiles。因此,从测试的角度来看,应用程序上下文设置可以描述如下:
为了封装旧组件对配置文件的需求,OldComponents.class如下所示:
问题在于静态块似乎没有及时执行。运行mvn clean install时,测试会抛出IllegalStateException,因为无法加载ApplicationContext。我已经验证了静态块的执行,但是似乎OldContext1和OldContext2(这取决于配置文件)已经在此时加载,这意味着为时已晚。
令人沮丧的是,IntelliJ可以正常运行测试,但Maven却不行。有没有办法强制使用这些配置文件而又保持封装性?我尝试创建一个中间上下文类,但它并没有解决问题。
如果我们在测试类上使用@ActiveProfiles注解,则可以正常运行,但这有点违背初衷。当然,我们希望在生产环境中实现相同的效果,这意味着如果无法封装配置文件的需求,则需要在web.xml中进行配置。
这个想法是封装所有这些旧的依赖项,使得其他组件不需要关心 Spring Profiles。因此,从测试的角度来看,应用程序上下文设置可以描述如下:
@ContextConfiguration(classes = {TestContext.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class MyTest {
//tests
}
TestContext进一步指向两个类,其中一个封装了旧的依赖项:
@Configuration
@Import(value = {OldComponents.class, NewComponents.class})
public class TestContext {
//common spring context
}
为了封装旧组件对配置文件的需求,OldComponents.class如下所示:
@Configuration
@Import(value = {OldContext1.class, OldContext2.class})
public class OldComponents {
static {
System.setProperty("spring.profiles.active", "test");
}
}
问题在于静态块似乎没有及时执行。运行mvn clean install时,测试会抛出IllegalStateException,因为无法加载ApplicationContext。我已经验证了静态块的执行,但是似乎OldContext1和OldContext2(这取决于配置文件)已经在此时加载,这意味着为时已晚。
令人沮丧的是,IntelliJ可以正常运行测试,但Maven却不行。有没有办法强制使用这些配置文件而又保持封装性?我尝试创建一个中间上下文类,但它并没有解决问题。
如果我们在测试类上使用@ActiveProfiles注解,则可以正常运行,但这有点违背初衷。当然,我们希望在生产环境中实现相同的效果,这意味着如果无法封装配置文件的需求,则需要在web.xml中进行配置。