为了账号安全,请及时绑定邮箱和手机立即绑定

Spring @Value 读取的继承属性为空

Spring @Value 读取的继承属性为空

蓝山帝景 2023-01-05 16:46:46
我正在尝试在子类中使用 spring 通过 @Value 读取的一些属性。这些属性在父类中被正确读取,但在子类中最终为 null。我使用的是注释配置而不是 xml 配置。例如,我试图在扩展 WebTemplate 的 TestListeners 中使用来自 WebTemplate 的属性 reportType:@ContextConfiguration(classes = AppConfig.class)@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)public class WebTemplate extends AbstractTestNGSpringContextTests {    @Autowired    protected SeleniumDriver driver;    @Value("${environment.url}")    protected String environmentUrl;    @Value("${report.type}")    protected String reportType;    @Value("${auto.open.report}")    protected String autoOpenReport;}这里的属性最终为空。如果我在 WebTemplate 中使用它们,一切都很好并且可以工作。public class TestListener extends WebTemplate implements ITestListener {        @Override    public void onTestStart(ITestResult result) {                System.out.println(reportType);                System.out.println(autoOpenReport);我还考虑过 Webtemplate 对象在测试周期的某个时候被破坏,并试图在每次测试开始时将它们存储在子类中,从 super 调用它们。这也没有用:public class TestListener extends WebTemplate implements ITestListener {    private String reportType;    private String autoOpenReport;    @Override    public void onTestStart(ITestResult result) {        this.reportType = super.reportType;        this.autoOpenReport = super.autoOpenReport;有什么建议吗?
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

更新:经过一番调查发现问题实际上是由弹簧引起的。类 WebTemplate 带有注释@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)。据我了解,这会在每次测试之后和进入听众之前立即破坏整个 spring 环境。因此,当进入各自的 testNg 侦听器时,spring 管理的所有内容都消失了。

我的兴趣是在测试类中只有 PageObjects Autowired,所以我最终从 spring 环境中删除了所有不是 PageObject 的东西。


查看完整回答
反对 回复 2023-01-05
?
慕斯王

TA贡献1864条经验 获得超2个赞

您有 2 个类,每个类都扩展,WebTemplate但是其中一个不由 Spring 管理,因此不会被注入/处理。扩展由 Spring 管理的类这一事实不会自动使创建的实例由 Spring 管理。

你有 2 个类,因此有 2 个不同的对象,它们不共享相同的WebTemplate属性。它们是 2 个不同的类,因此是实例。


查看完整回答
反对 回复 2023-01-05
  • 2 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信