2013-11-25 1 views
0

Чтобы написать интеграционный тест с Spring, я хочу загрузить контекст тестового приложения с помощью специального загрузчика классов. Причина в том, что мы используем LoadTimeWeaver (org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver или org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver). К сожалению, по умолчанию Sun classLoader не предоставляет необходимый метод addTransformer, требуемый LoadTimeWeaver. Используя javaagent с sprint-instrument.jar на vm startup, все работает отлично.Загрузка теста интеграции интеграции Spring с инструментами

Но это не является допустимым вариантом для тестов, которые должны быть запущены из разных машин, Ид и т.д.

Я попробовал простое решение, продлив 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 

возможно, потому что некоторые классы загружаются загрузчиком классов по умолчанию, а некоторые классы загружаются загрузчиком класса инструментария.

У вас есть хорошее решение?

Благодарим за помощь! Chris

+0

У вас есть все весенние банки на пути к классам? Какие у вас есть? –

+0

Хотя, вероятно, не все релевантно: spring-context, spring-web, spring-jms, spring-test, spring-security-core, spring-security-web, spring-security-config, spring-data-jpa, spring -datacommons-cor, spring-tx, spring-webmvc, весенний инструмент, весенний инструмент-кошка – user3022028

ответ

0

Вместо того чтобы использовать пользовательский загрузчик классов, который я написал свой собственный javaagent, который может быть загружен во время выполнения после этого руководства: http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents

Затем я продлил SpringJUnit4ClassRunner статически загрузить javaagent и она работает.