2017-02-22 60 views
0

Ситуация: Существует сервер, который будет принимать результаты тестов, которые я передаю ему, но только с учетом правильной авторизации и конфигурации клиента. Поэтому я написал класс клиента как bean-компонент, который загружает правильные учетные данные из application.properties (в той же усадьбе, которую вы подключили бы к базе данных с учетными данными и свойствами Spring). Теперь я хочу написать прослушиватель testng, который использует этот клиент для этого. Выполняя свои исследования, я обнаружил, что весной, которую нужно сделать, должно быть расширение AbstractTestExecutionListener.Зависимость от автозапуска Spring Boot в TestExecutionListeners

Так что, если я autowire моего клиента в качестве члена класса, как этот @Autowired private MyClient client; я могу видеть, что компонент создается корректно, однако, если я пытаюсь использовать его в моем слушателе, как это:

@TestExecutionListeners(mergeMode = MergeMode.MERGE_WITH_DEFAULTS, listeners = {MyListener.class}) 
public abstract class MyTestParent extends AbstractTestNGSpringContextTests { //... 

I может видеть, что бобы не автоуведомлены, что заставляет меня поверить, что эти слушатели создаются вне весеннего контекста как сами бобы.

Как написать прослушиватель (специфичный для пружины или testng), который может иметь зависимости, связанные с ним из контекста Spring? Что делать, если я хотел подтолкнуть результаты к какому-либо другому произвольному репозиторию результатов тестов, например базе данных?

ответ

1

Spring не определяет зависимости от Autowire в TestListeners. Но вы можете получить доступ к BeanFactory и использовать его для autowire слушателю себя:

public class CustomTestExecutionListener extends AbstractTestExecutionListener { 

    @Autowired 
    TestSupport support; 

@Override 
public void beforeTestClass(TestContext testContext) throws Exception { 
    //get the beanfactory and use it to inject into this 
    testContext.getApplicationContext() 
      .getAutowireCapableBeanFactory() 
      .autowireBean(this); 

    //now use the autowired field 
    support.beforeClass(); 
} 

... }

+0

Это не то, что я в конечном итоге делает, но он непосредственно ответил на мой вопрос. спасибо –