2015-01-18 5 views
14

Ich muss den Komponententest für eine meiner Dao-Klassen mit Spring ausführen. Hier ist meine Unit-Test:TestContextBootstrapper konnte nicht geladen werden - Spring Unit testing

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:app-config.xml"}) 
@ActiveProfiles("local") 
public class HouseDaoTest { 

    @Autowired 
    HouseDataDao houseDataDao; 

    @Test 
    public void saveTest(){ 
     HouseData data = new HouseData(); 
     Address add = new Address(); 
     // Truncating for sake of simplicity 
     houseDataDao.save(data); 
    } 
} 

And My Bean-Konfigurationsdateien:

app-config.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
    <import resource="BeanConfiguration-localhost.xml"/> 
    <import resource="BeanConfiguration-production.xml"/> 
</beans> 

BeanConfiguration-localhost.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans profile="local" 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 
    <context:annotation-config /> 
    <tx:annotation-driven /> 
    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/dbtest" /> 
     <property name="username" value="root" /> 
     <property name="password" value="" /> 
    </bean> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <!-- Tuncated for sake of simplicity --> 
    </bean> 
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 
    <!-- Project Specific Beans --> 
    <bean id="HouseDataDao" class="com.datasaver.dao.HouseDataDaoImpl"></bean> 
</beans> 

Wo BeanConfiguration-production.xml ist dasselbe wie oben, außer für <beans profile="production" ... darin.

Wenn ich einfach ein Maven-Test ausführen mvn test tun es versäumt, die folgende Ausnahme werfen:

java.lang.IllegalStateException: Could not load TestContextBootstrapper [class org.springframework.test.context.support.DefaultTestContextBootstrapper]. Specify @BootstrapWith's 'value' attribute or make the default bootstrapper class available. 
    at org.springframework.test.context.BootstrapUtils.resolveTestContextBootstrapper(BootstrapUtils.java:87) 
    at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:102) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:124) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:115) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:29) 
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:21) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:250) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) 
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) 
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) 
Caused by: java.lang.NoSuchMethodError: org.springframework.beans.BeanUtils.instantiateClass(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/Object; 
    at org.springframework.test.context.BootstrapUtils.resolveTestContextBootstrapper(BootstrapUtils.java:81) 
    ... 25 more 

Es sieht aus wie ich eine Abhängigkeit oder bin etwas fehlt, weil die stacktrace Caused by: java.lang.NoSuchMethodError: org.springframework.beans.BeanUtils.instantiateClass enthält.

Dies ist die Abhängigkeitsliste Frühling in meinem pom.xml:

... 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring</artifactId> 
     <version>2.5.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
     <version>4.1.4.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.1.4.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
    </dependency> 
... 

Antwort

1

Maarten ist richtig. Hier ist meine neue Liste von Abhängigkeiten in pom.xml, die für mich gearbeitet:

<dependencies> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.34</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate</artifactId> 
     <version>3.5.4-Final</version> 
     <type>pom</type> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>3.4.0.GA</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-commons-annotations</artifactId> 
     <version>3.3.0.ga</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring</artifactId> 
     <version>2.5.6</version> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
    </dependency> 
    <dependency> 
     <groupId>javassist</groupId> 
     <artifactId>javassist</artifactId> 
     <version>3.12.1.GA</version> 
    </dependency> 
</dependencies> 
+0

Sie sollten wirklich nicht ** Spring Framework 2.5.6 Module mit 'Feder-Test' 4.1 mischen, weil das im Grunde garantiert _not_ nicht funktioniert. –

20

Es ist wahrscheinlich ein Versionskonflikt, da Sie eine alte Version von Basisfeder (2.5.6) mit sehr neu verwenden (4.1.4 .RELEASE) für Ihren Test und Kontext enthält

+3

Es ist sicherlich ein Versionskonflikt. 'TestContextBootstrapper' wurde in Spring Framework 4.1 eingeführt. So erfordert "Federtest" 4.1 die Version 4.1 von "Federbohnen", "Federkern", usw. Im Allgemeinen sollte die verwendete Version des Federtests mit der Version aller anderen Module aus dem Kernfederrahmen übereinstimmen. –

+0

ich liebe dich (in einem Entwickler-2-Entwickler-Weg) –

1

In meinem Fall war es ein Versionskonflikt verursacht durch activemq-alle. Diese Abhängigkeit (5.12.2 in meinem Fall) beinhaltet eine inkompatible Version der Feder (ich habe gerade auf Feder 4.3.4 aufgerüstet). Ersparen Sie sich also ein paar Stunden Debugging und prüfen Sie nicht nur die Abhängigkeitshierarchie in Ihrer bevorzugten IDE, sondern schauen Sie auch in diese JAR-Dateien, um zu sehen, ob org.springframework-Pakete eingebettet sind.

3

Die Version von Spring-Context, Spring-Core, Spring-Test beibehalten. Für mich ist es 4.1.6 für alle 3, und das löste meinen Versionskonflikt.

Verwandte Themen