2009-10-07 59 views
23

Tôi vừa nhận ra rằng DBUnit không tự tạo bảng (xem How do I test with DBUnit with plain JDBC and HSQLDB without facing a NoSuchTableException?).Có cách nào để DBUnit tự động tạo bảng không?

Có cách nào để DBUnit tự động tạo bảng từ tập dữ liệu hoặc dtd không?

EDIT: Để thử nghiệm đơn giản của một cơ sở dữ liệu trong bộ nhớ như HSQLDB, một cách tiếp cận thô có thể được sử dụng để tự động tạo bảng:

private void createHsqldbTables(IDataSet dataSet, Connection connection) throws DataSetException, SQLException { 
    String[] tableNames = dataSet.getTableNames(); 

    String sql = ""; 
    for (String tableName : tableNames) { 
     ITable table = dataSet.getTable(tableName); 
     ITableMetaData metadata = table.getTableMetaData(); 
     Column[] columns = metadata.getColumns(); 

     sql += "create table " + tableName + "("; 
     boolean first = true; 
     for (Column column : columns) { 
     if (!first) { 
      sql += ", "; 
     } 
     String columnName = column.getColumnName(); 
     String type = resolveType((String) table.getValue(0, columnName)); 
     sql += columnName + " " + type; 
     if (first) { 
      sql += " primary key"; 
      first = false; 
     } 
     } 
     sql += "); "; 
    } 
    PreparedStatement pp = connection.prepareStatement(sql); 
    pp.executeUpdate(); 
} 

private String resolveType(String str) { 
    try { 
    if (new Double(str).toString().equals(str)) { 
     return "double"; 
    } 
    if (new Integer(str).toString().equals(str)) { 
     return "int"; 
    } 
    } catch (Exception e) {} 

    return "varchar"; 
} 

Trả lời

15

Không thực sự. Khi câu trả lời bạn đã liên kết chỉ ra, các tệp xml dbunit chứa dữ liệu, nhưng không chứa các kiểu cột.

Và bạn thực sự không muốn làm điều này; bạn có nguy cơ làm ô nhiễm cơ sở dữ liệu của bạn với các tạo phẩm thử nghiệm, mở ra khả năng mã sản xuất sẽ vô tình dựa vào các bảng được tạo bởi quá trình thử nghiệm.

Cần làm điều này một cách mạnh mẽ cho thấy bạn không có quy trình tạo và bảo trì db được xác định đầy đủ và theo kịch bản.

3

số Bạn sẽ phải thực hiện một kịch bản SQL với định nghĩa bảng trong.

Như tôi đã đăng trong chủ đề khác, XML không chứa đủ dữ liệu để tạo bảng. Tôi đoán bạn có thể làm một cái gì đó đáng sợ như phân tích các giá trị để cố gắng tìm ra những giá trị nó chứa nhưng điều đó sẽ khá giòn. Điều này khác với Hibernate trong các lớp được chú thích đó chứa rất nhiều thông tin về cách cơ sở dữ liệu trông như thế nào. Một phần trong chú thích và một phần trong các trường kiểu Java có.

http://www.dbunit.org/faq.html#ddl

1

Nếu bạn đang sử dụng JPA, bạn thường có thể định cấu hình nhà cung cấp JPA của mình để nó tạo/cập nhật các bảng khi khởi tạo.

Ví dụ: cho chế độ ngủ đông, hãy chỉ định thuộc tính hibernate.hbm2ddl.auto và đặt giá trị của nó thành tạo-thả (nên được sử dụng để thử nghiệm).

Xem thêm: Hibernate Documentation, Chapter 3 Configuration

Tuy nhiên, hãy chắc chắn rằng nhà cung cấp JPA là lần đầu tiên truy cập vào DB;)

0

Tôi chỉ muốn kêu vang trong và nói rằng điều này rất hữu ích cho tôi. Tôi cần kết nối với một cơ sở dữ liệu Oracle và xuất nó sang một tệp XML, sau đó nhập nó làm cơ sở dữ liệu HSQL thử nghiệm và truy cập nó với Hibernate. Tôi đã sử dụng mã này để tạo ra các bảng trước khi làm

DatabaseOperation.CLEAN_INSERT.execute(conn, dataset);. 

Một lời cảnh báo, mặc dù mã này đặt cột đầu tiên của mỗi bảng làm khóa chính, vì vậy hãy cẩn thận nếu bạn sử dụng bảng mối quan hệ như bạn có thể có được một "Vi phạm ràng buộc khóa chính" khi nhập. Cảm ơn đoạn mã!

+0

này không tạo ra bất kỳ bảng, mã chỉ chèn dữ liệu từ các tập dữ liệu được cung cấp. – tak3shi

3

Spring Boot/Spring JDBC có thể khởi tạo một cơ sở dữ liệu với JDBC đơn giản.

Spring JDBC có tính năng khởi tạo DataSource.Spring Boot cho phép theo mặc định và tải SQL từ các vị trí tiêu chuẩn schema.sqldata.sql (trong thư mục gốc của đường dẫn lớp). Ngoài ra, Spring Boot sẽ tải các tệp schema-${platform}.sqldata-${platform}.sql (nếu hiện tại), trong đó nền tảng là giá trị spring.datasource.platform, ví dụ: bạn có thể chọn đặt tên nhà cung cấp của cơ sở dữ liệu (hsqldb, h2, oracle, mysql, postgresql, v.v.).

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

Các vấn đề liên quan