【问题标题】:Could not load TestContextBootstrapper - Spring Unit testing无法加载 TestContextBootstrapper - Spring 单元测试
【发布时间】:2015-03-16 19:10:13
【问题描述】:

我必须使用 Spring 对我的一个 Dao 类执行单元测试。这是我的单元测试:

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

还有我的 bean 配置文件:

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>

除了&lt;beans profile="production" ... 之外,BeanConfiguration-production.xml 与上面相同。

当我简单地执行一个 maven 测试时,mvn test 失败并抛出以下异常:

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

看起来我缺少依赖项或其他东西,因为堆栈跟踪包含Caused by: java.lang.NoSuchMethodError: org.springframework.beans.BeanUtils.instantiateClass

这是我pom.xml中的Spring依赖列表:

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

【问题讨论】:

    标签: spring unit-testing spring-test


    【解决方案1】:

    这可能是版本冲突,因为您使用旧版本的基础弹簧 (2.5.6) 和非常新的版本 (4.1.4.RELEASE) 进行测试,上下文包括

    【讨论】:

    • 肯定是版本冲突。 TestContextBootstrapper 在 Spring Framework 4.1 中引入。因此spring-test 4.1 需要spring-beansspring-core 等的4.1 版本。通常,使用的spring-test 版本应该与核心Spring 框架中所有其他模块的版本相匹配。
    • 我爱你(以开发者 2 开发者的方式)
    • 保持 Spring-Context、Spring-Core、Spring-test 的版本相同。对我来说,这 3 个都是 4.1.6,这解决了我的版本冲突。
    【解决方案2】:

    在我的情况下,这是由 activemq-all 引起的版本冲突。该依赖项(在我的情况下为 5.12.2)包括不兼容的 spring 版本(我刚刚升级到 spring 4.3.4)。因此,节省几个小时的调试时间,不仅要检查您最喜欢的 IDE 中的依赖层次结构,还要查看这些 jar 文件,看看是否有嵌入 org.springframework 包。

    【讨论】:

      【解决方案3】:

      马丁是正确的。这是我在 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>
      

      【讨论】:

      • 您真的应该将 Spring Framework 2.5.6 模块与 spring-test 4.1 混合使用,因为这基本上可以保证不会工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      相关资源
      最近更新 更多