2015-01-18 12 views
14

Devo eseguire il test dell'unità su una delle mie classi Dao utilizzando Spring. Ecco il mio test di unità:Impossibile caricare TestContextBootstrapper - Test dell'unità Spring

@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); 
    } 
} 

E configurazione Il fagiolo di file:

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> 

Dove BeanConfiguration-production.xml è lo stesso di sopra ad eccezione di <beans profile="production" ... in esso.

Quando ho semplicemente eseguire un test di Maven facendo mvn test fallisce gettando il seguente eccezione:

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 

Sembra che mi manca una dipendenza o qualcosa del genere, perché lo stacktrace contiene Caused by: java.lang.NoSuchMethodError: org.springframework.beans.BeanUtils.instantiateClass.

Qui è la lista della primavera dipendenza nel mio 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> 
... 

risposta

1

Maarten è corretto. Ecco la mia nuova lista delle dipendenze in pom.xml che ha lavorato per me:

<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

Dovresti davvero ** non ** stare mescolando i moduli Spring Framework 2.5.6 con 'spring-test' 4.1, perché fondamentalmente è garantito _non_ funzionare. –

20

Si tratta probabilmente di un conflitto di versione in quanto si utilizza una versione vecchia molla di base (2.5.6) con molto nuova (4.1.4 .RELEASE) per il test in contesto include

+3

È sicuramente un conflitto di versione. 'TestContextBootstrapper' è stato introdotto in Spring Framework 4.1. Quindi 'spring-test' 4.1 richiede la versione 4.1 di' spring-beans', 'spring-core', ecc. In generale la versione di' spring-test' usata dovrebbe corrispondere alla versione di tutti gli altri moduli del core framework di base. –

+0

ti amo (in un modo sviluppatore-2-sviluppatore) –

1

Nel mio caso si trattava di un conflitto di versione causati da ActiveMQ-tutti. Tale dipendenza (5.12.2 nel mio caso) include una versione incompatibile di primavera (ho appena aggiornato alla 4.3.4 di primavera). Quindi, risparmiate alcune ore di debug e controllate non solo la gerarchia delle dipendenze nel vostro IDE preferito, ma guardate anche dentro quei file jar per vedere se vi sono pacchetti org.springframework incorporati.

3

Mantenere la versione di Spring-Context, Spring-Core, Spring-test stesso. Per me è 4.1.6 per tutti e 3, e questo ha risolto il mio conflitto di versione.

Problemi correlati