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

我正在尝试在子类中使用 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;

有什么建议吗?


蓝山帝景
浏览 186回答 2
2回答

米琪卡哇伊

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

慕斯王

您有 2 个类,每个类都扩展,WebTemplate但是其中一个不由 Spring 管理,因此不会被注入/处理。扩展由 Spring 管理的类这一事实不会自动使创建的实例由 Spring 管理。你有 2 个类,因此有 2 个不同的对象,它们不共享相同的WebTemplate属性。它们是 2 个不同的类,因此是实例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java