正确使用子类化Spring ContextLoader进行测试

时间:2011-03-09 12:19:39

标签: spring java-ee spring-annotations spring-test

对于带有junit的spring应用程序的集成测试,我正在继承org.springframework.test.context.ContextLoader,因为我想使用已经存在的XmlWebApplicationContext来连接我的测试类,如下所示:

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

我的ContextLoader的实现如下:

public class 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)中,没有为我的类Test设置PropertyValues。

也许,我是否设置了错误的注释处理?

代码信息:正如您可能猜到的那样,我正在进行集成测试,因此启动嵌入式tomcat服务器以测试我的RESTful Web服务。如何通过嵌入式tomcat中的“hack”获取应用程序上下文如下所示:Getting Access to Spring with Embedded Tomcat 6

我期待着你的回复。 埃里克

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是你正在创建一个新的GenericApplicationContext,它不是Spring用来自动测试测试bean的那个。