为了用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
可能是因为某些类是由默认的类加载器加载的,而某些类是由检测类加载器加载的。
你有一个很好的解决方案吗?
感谢您的帮助! 克里斯
答案 0 :(得分:0)
我没有使用自定义类加载器,而是编写了我自己的javaagent,可以在运行时按照本指南加载:http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents
然后我扩展了SpringJUnit4ClassRunner以静态加载javaagent并且它可以工作。