3

对于我的带有 junit 的 spring 应用程序的集成测试,我正在子类化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) 中没有为我的类Test设置PropertyValues。

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

代码信息:正如您可能猜到的那样,我正在做一个集成测试,因此启动了一个嵌入式 tomcat 服务器来测试我的 RESTful web 服务。我的帖子中显示了如何从嵌入式 tomcat 获取应用程序上下文:使用嵌入式 Tomcat 6 访问 Spring

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

4

1 回答 1

0

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

于 2011-06-16T08:26:25.210 回答