Правильное использование подклассов весеннего ContextLoader для тестирования - PullRequest
3 голосов
/ 09 марта 2011

Для интеграционных тестов для моего весеннего приложения с junit я подклассифицирую org.springframework.test.context.ContextLoader, потому что я хочу использовать уже существующий XmlWebApplicationContext для подключения моего тестового класса следующим образом:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=MyContextLoader.class)
@Transactional
public class MyTest {
    @Autowired
    public AccountDao accountDao;
}

Реализация моего ContextLoader выглядит следующим образом:

открытый класс MyContextLoader реализует ContextLoader {

    @Override
    public String[] processLocations(Class<?> clazz, String... locations) {
        return locations;
    }

    @Override
    public ApplicationContext loadContext(String... locations) throws Exception {
        try {
            // Start Embedded Tomcat
            EmbeddedTomcat tomcat = new EmbeddedTomcat("mas", 8080);
            tomcat.launch();

            Context rootContext = tomcat.getRootContext();
            ContextLoaderListener contextLoaderListener = (ContextLoaderListener) rootContext.getApplicationLifecycleListeners()[0];
            XmlWebApplicationContext context = (XmlWebApplicationContext) contextLoaderListener.getContext();


            GenericApplicationContext c = new GenericApplicationContext(context);
            AnnotationConfigUtils.registerAnnotationConfigProcessors(c);

            //context.refresh();
            //context.registerShutdownHook();

            return context;
        }
        catch(Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }   
    }   
}

При помещении точки останова в метод loadContext(...) я могу вызвать getBean (AccountDao.class) и всеработает отлично.Однако, похоже, что мой тестовый класс на самом деле не подключен автоматически.Я немного отладил и пошагово прошел через код Spring, и кажется, что в методе AbstractAutowireCapableBeanFactory.populateBean (String beanName, AbstractBeanDefinition mbd, BeanWrapper bw) PropertyValues ​​не установлены для моего класса Test.

Возможно, янеправильная настройка обработки аннотаций?

Информация к коду: Как вы можете догадаться и увидеть, я провожу интеграционный тест и поэтому запускаю встроенный сервер Tomcat, чтобы протестировать мой веб-сервис RESTful.Как получить контекст приложения с помощью «хака» от встроенного кота, показано в моем посте здесь: Получение доступа к Spring с помощью Embedded Tomcat 6

Я с нетерпением жду ваших ответов.Erik

1 Ответ

0 голосов
/ 16 июня 2011

Я думаю, что проблема здесь в том, что вы создаете новый GenericApplicationContext, который Spring не использует для автоматического подключения тестового компонента.

...