我目前正在完善我们拥有的测试框架。对于当前的需求,我们必须支持多个 spring 配置文件,并多次运行测试,每次使用不同的配置文件。每个配置文件都针对单独的测试环境,因此可能会执行具有不同逻辑的不同测试集。
我正在上这样的测试课:
@ContextConfiguration(locations = { "classpath:META-INF/test-context.xml" })
public class Test extends AbstractTestNGSpringContextTests {
@Autowired
ProfileSpeciticBean profileSpecificBean;
...
}
这里,ProfileSpecificBean
是一个接口(interface),由单独的类实现。要注入(inject)的实际实现由 Activity 的 Spring 配置文件确定,我使用的是 Spring XML 上下文。我正在使用 Maven 构建项目,使用 -Dspring.profiles.active=profileName
命令,因此期望测试捕获传递的配置文件。
但是,当前测试失败,并在完整堆栈跟踪中出现此错误:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ProfileSpeciticBean found for dependency: expected at least 1 bean which qualifies as autowire candindate, found 0
经过对这个主题的一些研究,我发现 AbstractTestNGSpringContextTests
需要在测试类之上有一个 @ActiveProfiles
注释。所以,这段代码有效:
@ContextConfiguration(locations = { "classpath:META-INF/test-context.xml" })
@ActiveProfiles("profile1")
public class Test extends AbstractTestNGSpringContextTests ...
问题是:我想避免在我的类中对配置文件名称进行硬编码。我需要通过仅更改命令行脚本来为不同的配置文件运行相同的测试类。
以上可能吗?有没有办法让 TestNG 知道命令行配置文件,并重新使用相同的测试?我需要避免重复代码和配置来运行测试,因此为每个配置文件创建两个测试类并不是我想要的。
最佳答案
尝试以下 How to set JVM parameters for Junit Unit Tests?为实际运行测试的虚拟机设置系统变量 - 它与运行 maven 的虚拟机不同。
在那里设置您的个人资料。
您可以使用 Maven 系统参数从 Maven 调用(或使用 Maven 配置文件)进行设置。
关于java - 使用 spring 配置文件时将 bean Autowiring 到 TestNG 测试时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25114666/