使用检测加载Spring集成测试上下文

时间:2013-11-25 12:36:23

标签: java spring integration-testing instrumentation

为了用Spring编写集成测试,我想用自定义类加载器加载测试应用程序上下文。原因是我们使用LoadTimeWeaver(org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver或org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver)。不幸的是,默认的Sun classLoader没有提供LoadTimeWeaver所需的addTransformer方法。通过在vm启动时使用带有sprint-instrument.jar的javaagent,一切正常。

但对于不同机器,IDE等运行的测试,这不是一个有效的选项。

通过扩展GenericXmlContextLoader并为我的上下文加载器设置SimpleInstrumentableClassLoader,我尝试了一个简单的解决方案:

@ContextConfiguration(locations = { "classpath:/spring/_context.xml" }, loader = CustomApplicationContextLoader.class)

public class CustomApplicationContextLoader extends GenericXmlContextLoader {

    @Override
    protected void prepareContext(final GenericApplicationContext context) {
        super.prepareContext(context);
        context.setClassLoader(new SimpleInstrumentableClassLoader(ClassUtils.getDefaultClassLoader()));
    }
}

这导致错误,如

Class [org.springframework.context.config.ContextNamespaceHandler] for namespace [http://www.springframework.org/schema/context] does not implement the [org.springframework.beans.factory.xml.NamespaceHandler] interface

可能是因为某些类是由默认的类加载器加载的,而某些类是由检测类加载器加载的。

你有一个很好的解决方案吗?

感谢您的帮助! 克里斯

1 个答案:

答案 0 :(得分:0)

我没有使用自定义类加载器,而是编写了我自己的javaagent,可以在运行时按照本指南加载:http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents

然后我扩展了SpringJUnit4ClassRunner以静态加载javaagent并且它可以工作。