2016-04-22 3 views
1

Я использую весной с инъекцией зависимостей и наткнулся на этого загадочный куске кода в моем классе TestNG и хочу, чтобы очистить мою голову вокруг этого вопросаИнициализации с @BeforeClass против нетерпеливой инициализации в Java

Я это ниже кода

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

http://stackoverflow.com/questions/6335975/autowired-bean-is-null-when-referenced-in-the-constructor-of-another-bean – Savior

+0

http://stackoverflow.com/questions/15627792/заказ-в-которые-полей-в-боб-является инициализированы – Savior

ответ

2

Короткий ответ: инъекция боба происходит после создания экземпляров вашего класса.

Поскольку в создании myTestB (который должен начинаться с заглавной буквы, кстати), вы звоните getVarB на someInstanceA, который еще не введен, Вы получаете NullPointerException.

Второй случай работает, потому что @BeforeClass запускается один раз перед первым тестовым прогоном после создания объекта. Таким образом, при вызове someInstanceA#getVarB в getVarB метод someInstanceA уже автоуведомлен, а не null.

Смежные вопросы