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

Initializing with @BeforeClass vs eager initialization in java

我正在使用 spring 和依赖注入,在我的 TestNG class 中遇到了这段令人费解的代码,我想解决这个问题

我有下面的代码

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 注入发生在您的 class.

实例创建之后

因为在创建 myTestB(顺便说一句,它应该以大写字母开头)时,您在尚未注入的 someInstanceA 上调用 getVarB,您会得到一个NullPointerException.

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