2010-10-15 34 views
14

Tôi đang sử dụng DbUnit trong phiên bản mới nhất 2.4.8 và tôi nhận được nhiều cảnh báo trong các bài kiểm tra đơn vị của tôi với tin nhắn này:DbUnit - Cảnh báo: AbstractTableMetaData

WARN : org.dbunit.dataset.AbstractTableMetaData - 
Potential problem found: The configured data type factory 
    'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' 
    might cause problems with the current database 'MySQL' (e.g. some datatypes may 
    not be supported properly). In rare cases you might see this message because the 
    list of supported database products is incomplete (list=[derby]). If so please 
    request a java-class update via the forums.If you are using your own 
    IDataTypeFactory extending DefaultDataTypeFactory, ensure that you override 
    getValidDbProducts() to specify the supported database products. 

Vì vậy, tôi nghĩ rằng tôi thêm này (tôi sử dụng một MySQL cơ sở dữ liệu):

protected void setUpDatabaseConfig(DatabaseConfig config) { 
    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory()); 
} 

Nhưng điều này không giúp tránh những cảnh báo này. Có gì sai ở đây?

Cảm ơn bạn trước & Trân trọng Tim.

+0

Bạn đã thử các "Nếu vậy hãy yêu cầu cập nhật java-class thông qua các diễn đàn" con đường? –

+0

Không, đó là cái này: MySqlDataTypeFactory. Nó sẽ ổn thôi. – Tim

+0

Bạn có thể hiển thị mã của mình không? Bạn đang gọi setUpDatabaseConfig ở đâu? – Frans

Trả lời

28

Tôi đã giải quyết vấn đề này với thông tin từ dbunit faq. Chỉ cần thiết lập thuộc tính factory type data làm cho cảnh báo biến mất.

Connection dbConn = template.getDataSource().getConnection(); 

    IDatabaseConnection connection = new DatabaseConnection(dbConn, "UTEST", false); 

    DatabaseConfig dbConfig = connection.getConfig(); 

    // added this line to get rid of the warning 
    dbConfig.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new OracleDataTypeFactory()); 
+0

tại chỗ, cảm ơn! – stantonk

+4

OK! Đối với cơ sở dữ liệu Mysql, chỉ cần thay thế 'new OracleDataTypeFactory()' trong dòng cuối cùng bằng 'new MySqlDataTypeFactory()'. –

+1

Mẹo: Xem tất cả [lớp triển khai thực hiện] đã biết (http://dbunit.sourceforge.net/apidocs/org/dbunit/dataset/datatype/IDataTypeFactory.html) để tìm tệp phù hợp với cơ sở dữ liệu của bạn. – Laimoncijus

3

Tôi đang sử dụng trình điều khiển JTDS và MS SQL 2008. Trong lớp DBUntiTest của tôi, hãy ghi đè phương thức sau. Tin nhắn cảnh báo biến mất.

@Override 
protected void setUpDatabaseConfig(DatabaseConfig config) { 
    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MsSqlDataTypeFactory()); 
} 
4

Tôi biết đây là một chủ đề cũ nhưng tất cả các câu trả lời ở đây phức tạp hơn mức cần thiết.

Cách đơn giản nhất để thực hiện cài đặt nhà máy trên mỗi lần mua kết nối là supply một OperationListener và thực hiện phương thức connectionRetrieved để thực hiện những gì bạn muốn. Không cần ghi đè; người nghe sẽ được gọi mỗi khi có được IDatabaseConnection.

+0

Tất cả các liên kết trong câu trả lời này đều đã chết. – Stephan

+0

Đã sửa lỗi; cảm ơn! –

+0

kết nốiCó vẻ như bị xóa ... – Stephan

1

@ câu trả lời của người lắp ráp là phát hiện. Chỉ cần thêm rằng tôi đang thử nghiệm với các sản phẩm cơ sở dữ liệu khác nhau, vì vậy bây giờ tôi đặt Nhà máy DataType theo kết nối hiện tại:

private IDatabaseConnection getConnection(Connection jdbcConnection) throws Exception { 
    String databaseProductName = jdbcConnection.getMetaData().getDatabaseProductName(); 

    DatabaseConnection databaseConnection = new DatabaseConnection(jdbcConnection); 
    DatabaseConfig dbConfig = databaseConnection.getConfig(); 

    switch (databaseProductName) { 
    case "HSQL Database Engine": 
     dbConfig.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory()); 
     break; 
    case "MySQL": 
     dbConfig.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory()); 
     break; 
    default: 
     log.warn("No matching database product found when setting DBUnit DATATYPE_FACTORY"); 
    } 

    return databaseConnection; 
} 

Bạn rõ ràng có thể thêm bất kỳ cơ sở dữ liệu bổ sung nào vào danh sách này.

3

Với mùa xuân-Boot bạn có thể sử dụng đậu cấu hình như vậy

@Configuration 
public class DbUnitConfiguration { 

@Autowired 
private DataSource dataSource; 

@Bean 
public DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection() { 
    DatabaseConfigBean bean = new DatabaseConfigBean(); 
    bean.setDatatypeFactory(new MySqlDataTypeFactory()); 

    DatabaseDataSourceConnectionFactoryBean dbConnectionFactory = new DatabaseDataSourceConnectionFactoryBean(dataSource); 
    dbConnectionFactory.setDatabaseConfig(bean); 
    return dbConnectionFactory; 
    } 
}