【发布时间】:2023-04-06 01:30:01
【问题描述】:
我目前正在完善我们拥有的测试框架。对于当前的需求,我们必须支持多个弹簧配置文件,并多次运行我们的测试,每次使用不同的配置文件。每个配置文件都针对不同的测试环境,因此可以执行具有不同逻辑的不同测试集。
我有一个这样的测试课:
@ContextConfiguration(locations = { "classpath:META-INF/test-context.xml" })
public class Test extends AbstractTestNGSpringContextTests {
@Autowired
ProfileSpeciticBean profileSpecificBean;
...
}
这里,ProfileSpecificBean 是一个接口,由不同的类实现。要注入的实际实现由活动的 Spring 配置文件决定,我使用的是 Spring XML 上下文。我正在使用 Maven 构建项目,使用 -Dspring.profiles.active=profileName 命令,因此期望测试能够捕获通过的配置文件。
但是,当前测试在完整堆栈跟踪中失败并出现此错误:
org.springframework.beans.factory.NoSuchBeanDefinitionException: 没有为依赖找到 ProfileSpeciticBean 类型的合格 bean: 预计至少有 1 个符合自动装配候选资格的 bean,找到 0
在对该主题进行一些研究后,我发现 AbstractTestNGSpringContextTests 需要在测试类顶部添加 @ActiveProfiles 注释。所以,这段代码有效:
@ContextConfiguration(locations = { "classpath:META-INF/test-context.xml" })
@ActiveProfiles("profile1")
public class Test extends AbstractTestNGSpringContextTests ...
这样做的问题是:我想避免在我的类中硬编码配置文件名称。我需要为不同的配置文件运行相同的测试类,只需更改命令行脚本。
以上可能吗?有没有办法让 TestNG 知道命令行配置文件,并重新使用相同的测试?我需要避免重复代码和配置以使我的测试运行,因此为每个配置文件创建两个测试类不是我想要的。
【问题讨论】:
标签: java spring testng spring-profiles