使用Spring bean profiles可以很好地适应Web应用环境的变化。
我们遇到的问题是当我们的集成测试代码需要更改环境时。在这些情况下,集成测试会加载Web应用程序的应用程序上下文。这样,我们就不必重新定义数据库连接、常量等(应用DRY原则)。
我们按以下方式设置我们的集成测试。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ["classpath:applicationContext.xml"])
public class MyTestIT
{
@Autowired
@Qualifier("myRemoteURL") // a value from the web-app's applicationContext.xml
private String remoteURL;
...
}
我可以使用@ActiveProfiles
在本地运行,但这是硬编码的,并会导致我们在构建服务器上的测试失败。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ["classpath:applicationContext.xml"])
@ActiveProfiles("development")
public class MyTestIT
{ ... }
我还尝试使用@WebAppConfiguration
,希望它可以以某种方式从Maven中导入spring.profiles.active
属性,但这并不起作用。
另外需要注意的是,我们还需要配置代码,使得开发人员可以在IntelliJ的测试运行器(或其他IDE)上运行Web应用程序,然后运行测试。这对于调试集成测试来说更容易。
ApplicationContextInitializer
来调用configurableApplicationContext.getEnvironment().setDefaultProfiles("development");
,这会在我通过IntelliJ运行测试时运行开发配置文件。 - David VActiveProfilesResolver
的示例?我不太清楚如何使用它。 - daydreamerActiveProfilesResolver
的示例。 - Sam BrannenSpringJUnit4ClassRunner
。我不得不这样做,因为Spring会非常急切地加载commons logging,如果您想以编程方式配置日志记录,则非常令人恼火。当然,您将不得不维护自己的ClassRunner,但至少您可以控制初始化和缓存。 - Adam Gent