使用@BeforeClass初始化vs在java中进行初始化初始化

时间:2016-04-22 16:33:24

标签: java spring dependency-injection initialization testng

我正在使用带有依赖注入的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就像一个默认构造函数,并且急切初始化类似于使用默认构造函数初始化变量。我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

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

因为在创建myTestB时(顺便说一下,它应该以大写字母开头),你在getVarB上调用尚未注入的someInstanceA,你得到一个{{ 1}}。

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

相关问题