Доступ к контексту spring в @BeforeTest testng

Я хотел бы зарегистрировать некоторые веб-области в контексте весны в моем методе @BeforeTest. Но оказывается, что весенний контекст все еще null в этот момент.

Однако тест проходит нормально, если я перехожу на @BeforeMethod. Интересно, как я могу получить доступ к контексту в @BeforeTest, потому что я не хочу, чтобы код регистрации области повторялся для каждого метода тестирования.

Ниже приведены фрагменты моего кода.

public class MyTest extends MyBaseTest {
    @Test public void someTest() { /*...*/ }
}

@ContextConfiguration(locations="/my-context.xml")
public class MyBaseTest extends AbstractTestNGSpringContextTests {
    @BeforeTest public void registerWebScopes() {
        ConfigurableBeanFactory factory = (ConfigurableBeanFactory)
                this.applicationContext.getAutowireCapableBeanFactory();
        factory.registerScope("session", new SessionScope());
        factory.registerScope("request", new RequestScope());
    }   

    /* some protected methods here */
}

Here's the error message when running the test:

FAILED CONFIGURATION: @BeforeTest registerWebScopes
java.lang.NullPointerException
    at my.MyBaseTest.registerWebScopes(MyBaseTest.java:22)

person Albert Gan    schedule 17.04.2012    source источник


Ответы (2)


Вызовите springTestContextPrepareTestInstance() в своем методе BeforeTest.

person Joe Snikeris    schedule 03.07.2012
comment
Знаете ли вы какую-либо документацию о том, почему внедренные члены недоступны в методах @BeforeTest и даже @BeforeSuite? - person ecbrodie; 28.03.2014
comment
10x :) это проще, чем писать bean-постпроцессор - person Ran Adler; 26.05.2015

TestNG запускает @BeforeTest методов перед @BeforeClass методами. springTestContextPrepareTestInstance() аннотируется @BeforeClass и устанавливает applicationContext. Вот почему applicationContext все еще null в методе @BeforeTest. @BeforeTest предназначен для прокрутки помеченной группы тестов. (Он не запускается перед каждым методом @Test, так что это немного неправильное название).

Вместо использования @BeforeTest вам, вероятно, следует использовать @BeforeClass (который запускается один раз перед первым @Test в текущем классе). Убедитесь, что это зависит от метода springTestContextPrepareTestInstance, как в

@BeforeClass(dependsOnMethods = "springTestContextPrepareTestInstance")
public void registerWebScopes() {
    ConfigurableBeanFactory factory = (ConfigurableBeanFactory) 
            this.applicationContext.getAutowireCapableBeanFactory();
    factory.registerScope("session", new SessionScope());
    factory.registerScope("request", new RequestScope());
}   

@BeforeMethod тоже работает (как вы упомянули), потому что они работают после @BeforeClass методов.

person kuporific    schedule 22.07.2014
comment
@BeforeClass (запускается перед любым @Tests в текущем классе). ‹-- Это неверно. Как указано в документации TestNG, @BeforeClass будет запущен до первого вызывается тестовый метод в текущем классе. - person JonyD; 25.09.2017
comment
@JonyD, спасибо, что указали на это, формулировка не ясна. Я отредактировал его на основе вашего предложения. - person kuporific; 25.09.2017