2013-02-27 2 views
0

Я использую компоненты Spring autoscan в своей тестовой среде.@Autowired имеет значение null в классе, который расширяет Junit Testwatcher

Autowired работает отлично во всех классах, кроме класса, который распространяется на Junit Testwatcher.

Класс, где я расширяю Junit testwatcher является:

@Component 
public class PrintTrace extends TestWatcher{//this class overrides pass and fail 
              //methods in Testwatcher   

@Autowired 
private HTMLLogger htmlLogger //this is null all the time. it works in 
           //other classes 
} 

Мой Базовый класс выглядит следующим образом:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:beans.xml"}) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, 
     DirtiesContextTestExecutionListener.class }) 
public class YahooTestSetUp { 

    public static WebDriver driver; 


    @Rule 
    public PrintTrace printTrace = new PrintTrace(); 



    @Autowired 
    private HTMLLogger htmlLogger;//here its working fine 
} 

И мой XML файл:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
    <context:annotation-config /> 
    <context:component-scan base-package="com.pilz"/> 
</beans> 

Пожалуйста, советы это очень важно для меня. В противном случае я должен пойти за объектами singleton, что для меня не является хорошим решением.


Добавление дополнительной информации:

Допустим, у меня есть 2 тестовые наборы, которые обращаются к 2 общих классов HTMLLogger.class и PrintTraece.class.

Каждый testuite не зависит от другого набора. Эти апартаменты имеют @BeforeClass и @AfterClass

смотри ниже:

@RunWith(Suite.class) 
@Suite.SuiteClasses({ AutowireClass.class}) 
public class YahooTestSuite extends YahooTestSetUp{ 
    private static HTMLLogger htmlLogger; 

    @BeforeClass 
    public static void allTests() throws Exception {**//Can I use @Autowired in 
                 static methods(no)** 

     htmlLogger = new HTMlLogger() 


     htmlLogger.createHTMLLogFile(); 
    } 

    @AfterClass 
    public static void afterAll() throws Exception{ 
     htmlLogger.htmlLogEnd(); 
    } 


} 

и другой люкс делает то же самое для другого модуля.

Как я уже говорил мой PrintTrace.class расширяет Testwatcher.class (правило Junit) его внешний вид, как

Этот класс вызывается с правилом, созданного в BaseClass.

@Component 
public class PrintTrace extends TestWatcher{ 

    private HTMLLogger htmlLogger = null; 
@Override 
    public void starting(final Description description) { 

    } 

    @Override 
    public void failed(final Throwable e, final Description description) { 
     htmlLogger.writeFailLog();**//This is common for all suites** 
             //This should be same object used in suite 
    } 

    @Override 
    public void succeeded(final Description description) { 

     htmlLogger.writePassLog();//This is common for all suites 
             //This should be same object used in suite 
    } 

    @Override 
    public void finished(Description description) { 


    } 

благодаря

ответ

0

В некоторых из классов Java, как тестовыми или веб-слушателей, @Autowired не работает. Вы должны определить applicationContext как объект и получать beans вручную.

ApplicationContext context = AnnotationConfigApplicationContext("app_context_file_path") 

HTMLLogger htmlLogger = context.getBean("loggerBeanName"); 

Кроме того, есть вид здесь - http://static.springsource.org/spring/docs/3.0.x/reference/testing.html

И Google о @Resource весенней аннотацию.

Чтобы получить точный объект вам нужно, вы должны иметь следующую конфигурацию:

При создании компонента в файле контекста приложения, просто используйте идентификатор этого в методе getBean(name). Если у вас это как отдельный класс, предоставьте ему (класс) аннотацию @Component(value) и сканируйте пакет в контексте приложения. После этого используйте имя значения этого компонента (компонента), чтобы получить точный объект, который вы настроили.

+0

Я должен использовать тот же объект в другом классе. Итак, как мне это получить. Если я снова загружу компонент, тогда будет два экземпляра. Я хочу использовать один и тот же компонент в моей структуре. – user2087450

+0

Нет. Это будет тот же объект, что и вы получите через @Autowired. Я покажу вам путь в моем редактировании. – user

+0

Я новичок в весне. Я запутался. Я добавил дополнительную информацию в разделе «Добавление дополнительной информации». Пожалуйста, помогите мне, где я должен загружать бобы и повторно использовать. – user2087450

0

Почему вы хотите использовать Spring DI для правил JUnit? Ваш тестовый код не является вашим приложением.

+0

Я не использую Spring DI для правил Junit, но для некоторых из моих собственных классов. ex: класс HTMLLogger. Это то, о чем вы просите. Если нет, объясните, почему я не должен использовать DI. – user2087450

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