2015-01-18 2 views
14

스프링을 사용하여 Dao 클래스 중 하나에서 유닛 테스트를 실행해야합니다.TestContextBootstrapper를로드 할 수 없습니다 - 스프링 유닛 테스트

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

그리고 내 빈 설정 파일 :

앱 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> 

여기 내 단위 테스트입니다 BeanConfiguration-production.xml은 <beans profile="production" ...을 제외하고는 위와 같습니다.

나는 단순히 다음과 같은 예외를 던지는 실패 mvn test 일을 받는다는 테스트를 실행하면 : 스택 트레이스가 Caused by: java.lang.NoSuchMethodError: org.springframework.beans.BeanUtils.instantiateClass 포함되어 있기 때문에 내가 종속성 또는 뭔가를 놓친 거지 같은

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 

것 같습니다.

... 
    <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> 
... 

답변

1

Maarten이 정확합니다. 여기에 나를 위해 일한 pom.xml에 종속 나의 새로운 목록입니다 : 내 경우

<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

Spring Framework 2.5.6 모듈을'spring-test' 4.1과 섞어서는 안됩니다. 왜냐하면 기본적으로 작동하지 않을 것을 보장하기 때문입니다. –

20

그것은 당신이 아주 새로운 하나를 기본 스프링 (2.5.6)의 이전 버전을 사용하고 있기 때문에 버전 충돌이 아마도 (4.1.4 : 여기에

pom.xml에서 Spring의 의존성 목록 . 릴리스) 귀하의 테스트 en 문맥에 포함

+3

분명히 버전 충돌입니다. 'TestContextBootstrapper'는 Spring Framework 4.1에서 소개되었습니다. 따라서'spring-test' 4.1은'spring-beans','spring-core' 등의 4.1 버전이 필요합니다. 일반적으로'spring-test' 버전은 Spring Framework의 다른 모든 모듈의 버전과 일치해야합니다. –

+0

당신을 사랑합니다 (개발자 -2 개발자 방식으로) –

1

이는 ActiveMQ를 모두에 의한 버전 충돌했다. 그 의존성 (필자의 경우 5.12.2)은 호환되지 않는 버전의 스프링을 포함하고있다 (나는 스프링 4.3.4로 업그레이드했다). 따라서 몇 시간 동안 디버깅을하지 않고 자주 사용하는 IDE의 Dependency Hierarchy를 검사 할뿐만 아니라 jar 파일을 조사하여 org.springframework 패키지가 포함되어 있는지 확인하십시오.

3

스프링 컨텍스트, 스프링 코어, 스프링 테스트 버전을 동일하게 유지하십시오. 나를 위해 그것은 모두 3에 대해 4.1.6이며, 이것은 나의 버전 충돌을 해결했다.

관련 문제