2012-12-17 3 views
8

Ich benutze Spring 3.2 mit Java-basierter Konfiguration und habe einige Probleme mit meinen Unit-Tests (JUnit 4.8.1). Das ist also ein Test Runner:Spring 3.2 Unit Test mit Java-basierter Konfiguration

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes={TestConfig.class}) 
public class ManualTest 
{ 
    @Autowired 
    ... 

Howeever, erhalte ich diesen Fehler:

Caused by: java.lang.IllegalStateException: CGLIB is required to process @Configuration classes. Either add CGLIB to the classpath or remove the following @Configuration bean definitions: [testConfig] 
at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:327) 
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:222) 

Da die Spring blog Staaten, Frühling 3.2 ist inlining CGLIB 3. Warum erhalte ich diesen Fehler?

Ich benutze Gradle 1.3 als Build-Management-Tool und STS als IDE. Beim Aufruf gradle eclipse gradle zieht in den Abhängigkeiten zweimal: einmal als Klarglas und eine Zeit als Bibliothek:

Zuerst als Klarglas: plain jar

und als als Bibliothek:

library

Im einfachen Jar Abschnitt hatte ich noch Spring 3.1 konfiguriert, während im Bibliotheksbereich Spring 3.2 war. Also entfernte ich die einfachen Gläser und alles funktionierte.

Das ist mein Projekt build.gradle

configurations 
{ 
    driver 
} 

dependencies 
{ 
    driver 'com.oracle:ojdbc6:11.2.0' 

    compile "org.springframework:spring-jdbc:$springVersion" 

    testCompile 'com.oracle:ojdbc6:11.2.0' 
    testCompile "org.springframework:spring-test:$springVersion" 
    testCompile "commons-dbcp:commons-dbcp:$dbcpVersion" 
    testCompile "junit:junit:$junitVersion" 
    testCompile "org.slf4j:slf4j-log4j12:$slf4jVersion" 
} 

sourceSets 
{ 
    main 
    { 
     java 
     { 
      srcDirs 'src/main/java', "$buildDir/generated-sources/" 
     } 
    } 
} 

Und die build.gradle aus dem Masterprojekt

configure(allprojects) 
{ 
    ext.dbcpVersion = '1.4' 
    ext.springVersion = '3.2.0.RELEASE' 
    ext.junitVersion = '4.8.1' 
    ext.slf4jVersion = '1.7.2' 
} 

subprojects 
{ 
    // Artifact settings 
    group = 'xxx' 
    version = '1.0-SNAPSHOT' 

    // Standard plugins 
    apply plugin: 'java' 
    apply plugin: 'eclipse' 

    // Repositories 
    repositories 
    { 
     mavenLocal() 
     maven 
     { 
      url "http://repo.springsource.org/release" 
     } 
     mavenCentral() 
    } 

    // Standard dependencies 
    dependencies 
    { 
    } 
} 
+0

Können Sie Ihren Klassenpfadinhalt posten? oder pom.xml wenn du maven verwendest? – ElderMael

+0

Scheitert es sowohl in Eclipse als auch in der Kommandozeile? – artbristol

+0

Nur in Eclipse (STS). – ChrLipp

Antwort

2

ich alle Eclipse-Projekte gelöscht und die Einstellungen und alle Gradle temporäre Dateien. Dann habe ich versucht, das Projekt in Eclipse (Import Gradle Projekt ..) zu importieren. Dies ist mit einer Ausnahme fehlgeschlagen. Dann löschte ich die Gradle-Einstellungen im Eclipse-Projekt und danach funktionierte der Import.

Also ich werde gradle eclipse mit Version 1.3 nicht verwenden.

Auch der zusätzliche Quellsatzpfad ist nicht als Quellpfad in das Eclipse-Projekt gelangt.

1

Ich hatte das gleiche Problem. Fügen Sie einfach diese Abhängigkeit zu Ihrer pom.xml-Datei:

<dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

Und Ihre Unit-Tests und Runtime-Code sollte ordnungsgemäß ohne cglib Fehler arbeiten.

+0

Ich migrierte ein Projekt von Maven nach Gradle und überraschenderweise war die verwendete Version der Spring-Kontext-Abhängigkeit eine andere: 3.1.x statt der erwarteten 4.x. Dies erklärt die Ausnahme, weil Spring Cglib seit 3.2 aber nicht zuvor inline. Nach dem Hinzufügen der oben genannten Abhängigkeit verschwand der Fehler.Das ist schade, dass Gradle Mavens Importumfang noch nicht unterstützt. Sonst könnte man auch BOM (Bill of Materials) verwenden. – rwitzel