我正在使用 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/