java - 使用 @BeforeClass 初始化 vs java 中的急切初始化

标签 java spring dependency-injection initialization testng

我正在使用 spring 进行依赖注入(inject),并在我的 TestNG 类中遇到了这段令人费解的代码,我想理清这个问题的思路

我有下面的代码

public class myBase {

    @Autowired @Lazy @Qualifier("someInstanceA")
    protected SomeClass someInstanceA;
.
.
}

public class myTestB extends myBase {
    private String varB = someInstanceA.getVarB();

    @Test
    .
    .
}

上面的代码在行处给了我一个 NullPointerException

 private String varB = someInstanceA.getVarB();

但是当我在下面这样做时

 public class myTestB extends myBase {
    private String varB;

    @BeforeClass
    private void getVarB() {
        varB = someInstanceA.getVarB();
    }

    @Test
    .
    .
}

测试运行良好。我读到 BeforeClass 就像一个默认构造函数,而急切初始化类似于使用默认构造函数初始化变量。我在这里缺少什么?

最佳答案

简短的回答:Bean 注入(inject)发生在创建类的实例之后。

由于在创建 myTestB (顺便说一句,它应该以大写字母开头)时,您在 someInstanceA 上调用 getVarB ,这是尚未注入(inject),您会收到 NullPointerException

第二种情况有效,因为 @BeforeClass 在第一次测试运行之前、对象创建之后运行一次。因此,当在 getVarB 方法中调用 someInstanceA#getVarB 时,someInstanceA 已经 Autowiring 并且不为 null。

关于java - 使用 @BeforeClass 初始化 vs java 中的急切初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36799074/

相关文章:

java - 我如何从 Android SDK 解析 PHP 数组?

java - 如何在java中将对象转换为字符串

java - 为什么 Spring Value 中的默认值不能防止 NULL 错误?

java - 当该 bean 已经通过 xml 设置了另一个属性时,是否可以通过 Autowiring 注入(inject)属性

c# - Ninject 覆盖绑定(bind)

java - 如何仅使用控制台运行 java 应用程序?

java - JADE ACLMessage InReplyTo 和 ReplyWith

java - 添加了 Spring RestTemplate,启动到 Tomcat7 时出现异常

java - 使用 <form :hidden> 将 Map 值传递给 Spring MVC Controller

java - 同一 session 中 Sessionscoped Bean 的多个实例