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

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贡献1736条经验 获得超6个赞

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

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


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

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

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

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


查看完整回答
反对 回复 2023-01-05

添加回答

举报

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