我正在使用带有依赖注入的spring,并在我的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注入发生在创建类实例之后。

由于在创建myTestB(顺便说一句,应以大写开头)时,您在尚未注入的getVarB上调用someInstanceA,因此得到了NullPointerException

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

10-05 19:23