2014-12-26 15 views
11

Tôi đang sử dụng mùa xuân-test-DBUnit và tôi nhận được một cảnh báo trong các thử nghiệm đơn vị của tôi với tin nhắn này:mùa xuân Kiểm tra DBUnit Warning

Code:

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

} 

Cảnh báo:

1093 [main] WARN org.dbunit.dataset.AbstractTableMetaData - Tiềm năng vấn đề được tìm thấy: Nhà máy kiểu dữ liệu được định cấu hình 'lớp org.dbunit.dataset.datatype.DefaultDataTypeFactory' có thể gây ra vấn đề với cơ sở dữ liệu hiện tại 'MySQL' (ví dụ: một số kiểu dữ liệu có thể không được hỗ trợ đúng cách). Trong một số ít trường hợp, bạn có thể thấy thông báo này vì danh sách các sản phẩm cơ sở dữ liệu được hỗ trợ không đầy đủ (danh sách = [derby]). Nếu vậy, vui lòng yêu cầu cập nhật lớp java qua diễn đàn .Nếu bạn đang sử dụng IDataTypeFactory mở rộng riêng của mình DefaultDataTypeFactory, hãy đảm bảo rằng bạn ghi đè getValidDbProducts() để chỉ định các sản phẩm cơ sở dữ liệu được hỗ trợ.

Vấn đề có thể được giải quyết khi tôi sử dụng DBUnit mà không mùa xuân-test-DBUnit như sau:

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()); 

Tôi không biết làm thế nào để giải quyết vấn đề này trong mùa xuân-test-DBUnit. Hãy giúp tôi.

Trả lời

15

Sự cố được giải quyết. Tôi thêm cấu hình sau vào 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> 
10

Chỉ muốn thêm các giải pháp tương tự như 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; 
} 
+0

Và đảm bảo rằng tất cả tên của phương thức đều giống y như @Yser đã đề cập ở trên ... – Nick

1

Nhờ Lynn Nino. Câu trả lời giúp tôi để sửa cấu hình cho cơ sở dữ liệu H2 của tôi:

<?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> 
3

Để bổ sung cho câu trả lời hiện tại, tôi chỉ muốn thêm những gì làm việc cho tôi trong một bối cảnh mùa xuân Boot, sử dụng Boot mùa xuân cấu hình nguồn dữ liệu. Thêm lớp sau trong nguồn thử nghiệm của bạn (trong một gói sẽ được chọn bằng tự động định cấu hình):

@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; 
    } 
} 
Các vấn đề liên quan