【问题标题】:Spring Test DBunit Warning春季测试 DBunit 警告
【发布时间】:2015-02-23 12:05:22
【问题描述】:

我正在使用 spring-test-dbunit,我在单元测试中收到一条警告消息:

代码:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/context.xml"})
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
    DirtiesContextTestExecutionListener.class,
    TransactionalTestExecutionListener.class,
    DbUnitTestExecutionListener.class })
public class TestDB {

    @Autowired 
    private ICourseService courseService;

    @Test
    @DatabaseSetup("sampleData.xml")
    public void testFind() throws Exception {
        List<Course> courseList = this.courseService.getAllCourses();

        assertEquals(1, courseList.size());
        assertEquals("A001", courseList.get(0).getCourseNumber());
    }

}

警告:

1093 [main] WARN org.dbunit.dataset.AbstractTableMetaData - 潜力 发现问题:配置的数据类型工厂'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' 可能会导致 当前数据库“MySQL”的问题(例如,某些数据类型可能 没有得到适当的支持)。在极少数情况下,您可能会看到此消息 因为支持的数据库产品列表不完整 (列表=[德比])。如果是这样,请通过 论坛。如果您使用自己的 IDataTypeFactory 扩展 DefaultDataTypeFactory,确保覆盖 getValidDbProducts() 指定支持的数据库产品。

当我使用没有spring-test-dbunit的DBunit时,问题可以解决如下:

  Connection jdbcConnection = DriverManager.getConnection( "jdbc:mysql://localhost/test", "root", "root");
        IDatabaseConnection connection = new DatabaseConnection(jdbcConnection);
        connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
        connection.getConfig().setProperty(DatabaseConfig.PROPERTY_METADATA_HANDLER, new MySqlMetadataHandler());

我不知道如何在 spring-test-dbunit 中解决这个问题。请帮忙。

【问题讨论】:

    标签: java junit junit4 dbunit spring-test-dbunit


    【解决方案1】:

    问题解决了。 我将以下配置添加到 applicationContext.xml (context.xml) 中。

    <property name="location">
            <value>classpath:jdbc.properties</value>
        </property> 
    </bean>  
    
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />
    </bean>
    
    <bean id="sqlDataTypeFactory" class ="org.dbunit.ext.mysql.MySqlDataTypeFactory" />
    
    <bean id="dbUnitDatabaseConfig" class="com.github.springtestdbunit.bean.DatabaseConfigBean">
         <property name = "datatypeFactory" ref = "sqlDataTypeFactory" />
    </bean> 
    <bean id="dbUnitDatabaseConnection" class="com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean">
        <property name="databaseConfig" ref="dbUnitDatabaseConfig"/>
        <property name="dataSource" ref="dataSource" />
    </bean>
    

    【讨论】:

      【解决方案2】:

      只是想添加与 Java Config 相同的解决方案:

      @Bean
      public DataSource dataSource() {
          DataSource dataSource = ...
          return dataSource;
      }
      
      @Bean
      public DatabaseConfigBean dbUnitDatabaseConfig() {
          DatabaseConfigBean dbConfig = new com.github.springtestdbunit.bean.DatabaseConfigBean();
          dbConfig.setDatatypeFactory(new org.dbunit.ext.h2.H2DataTypeFactory());
          return dbConfig;
      }
      
      @Bean
      public DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection() {
          DatabaseDataSourceConnectionFactoryBean dbConnection = new com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean(dataSource());
          dbConnection.setDatabaseConfig(dbUnitDatabaseConfig());
          return dbConnection;
      }
      

      【讨论】:

      • 并确保所有 bean 名称,即方法名称与上面提到的 @Yser 完全相同...
      【解决方案3】:

      为了补充现有的答案,我只想使用 Spring Boot 配置的数据源在 Spring Boot 上下文中添加对我有用的内容。在您的测试源中添加以下类(在将由 autoconfig 选择的包中):

      @Configuration
      public class DBUnitConfig {
      
          @Autowired
          private DataSource dataSource;
      
          @Bean
          public DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection() {
              DatabaseConfigBean bean = new DatabaseConfigBean();
              bean.setDatatypeFactory(new H2DataTypeFactory());
      
              DatabaseDataSourceConnectionFactoryBean dbConnectionFactory = new com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean(dataSource);
              dbConnectionFactory.setDatabaseConfig(bean);
              return dbConnectionFactory;
          }
      }
      

      【讨论】:

        【解决方案4】:

        感谢林恩尼诺。答案帮助我更正了我的 H2 数据库的配置:

        <?xml version="1.0" encoding="UTF-8"?>
        <beans 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-3.0.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
        
            <context:component-scan base-package="isi.power.share" />
        
            <tx:annotation-driven transaction-manager="transactionManager" />
        
            <!-- H2 database JDBC settings -->    
            <bean id="dataSource"
                  class="org.h2.jdbcx.JdbcDataSource">
                <property name="URL" value="jdbc:h2:mem:paging;DB_CLOSE_DELAY=-1;MODE=MySQL;INIT=CREATE SCHEMA IF NOT EXISTS my_extra_schema;"/>
                <property name="user" value="root"/>
                <property name="password" value="password"/>
            </bean>    
        
            <!-- set the data type factory for dbunit -->
            <bean id="h2DataTypeFactory" class ="org.dbunit.ext.h2.H2DataTypeFactory" />
        
            <bean id="dbUnitDatabaseConfig" class="com.github.springtestdbunit.bean.DatabaseConfigBean"> 
                 <property name = "datatypeFactory" ref = "h2DataTypeFactory" /> 
            </bean>  
        
            <bean id="dbUnitDatabaseConnection" class="com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean"> 
                <property name="databaseConfig" ref="dbUnitDatabaseConfig"/> 
                <property name="dataSource" ref="dataSource" /> 
            </bean> 
        
            <!-- provide a H2 console to look into the db if necessary -->
            <bean id="org.h2.tools.Server-WebServer" class="org.h2.tools.Server"
                factory-method="createWebServer" depends-on="dataSource"
                init-method="start" lazy-init="false">
                <constructor-arg value="-web,-webAllowOthers,-webPort,8085" />
            </bean>
        
            <!-- provide a TCP server to look into the db if necessary -->
            <bean id="org.h2.tools.Server-TcpServer" class="org.h2.tools.Server"
                factory-method="createTcpServer" depends-on="dataSource"
                init-method="start" lazy-init="false">
                <constructor-arg value="-tcp,-tcpAllowOthers,-tcpPort,9095" />
            </bean>
        
            <!-- define database entity manager factory & transaction manager -->
        
            <bean id="entityManagerFactory"
                class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
                <property name="dataSource" ref="dataSource" />
                <property name="jpaDialect">
                    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
                </property>
                <property name="persistenceXmlLocation"  value="classpath:META-INF/SpringDatabaseTestPersistence.xml" />
            </bean>
        
            <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
                <property name="entityManagerFactory" ref="entityManagerFactory" />     
            </bean>
        
        
        </beans>
        

        【讨论】:

          猜你喜欢
          • 2011-09-26
          • 2012-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-14
          • 1970-01-01
          • 2018-07-29
          • 2020-12-15
          相关资源
          最近更新 更多