2014-09-30 22 views
5

Tôi hỏi và trả lời câu hỏi này để tham khảo trong tương lai, bởi vì tôi nghĩ rằng tôi đã tìm thấy một giải pháp tốt cho một vấn đề chung với DbUnit. Tôi hy vọng nó giúp một ai đó, một nơi nào đó xuống dòng.DbUnit không làm sạch chèn: ràng buộc khóa ngoài

Tôi đang sử dụng DbUnit 2.5.0TestNG 6.8.8. Trường hợp sử dụng của tôi là một phần của cơ sở dữ liệu bao gồm 3 thực thể. Có ServiceUser chứa khóa ngoài cho cả số AdministrableUserGroup.

Tôi đi theo hầu hết các mã ví dụ từ http://city81.blogspot.com/2011/03/testing-jpa-entities-using-dbunit.html

public abstract class AbstractDatabaseTest { 
    protected EntityManager em; // initialized elsewhere 
    private IDatabaseConnection connection; 
    private IDataSet dataset; 

    @BeforeClass 
    private void setupDatabaseResource() throws Exception { 
     // using Hibernate 
     connection = new DatabaseConnection(((SessionImpl) (em.getDelegate())).connection()); 
     connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory()); 

     // full database export 
     IDataSet fullDataSet = connection.createDataSet(); 

     final String datasetPath = String.format("%s%s", RESOURCE_FOLDER, "Testing.xml"); 
     FlatXmlDataSet.write(fullDataSet, new FileOutputStream(datasetPath)); 

     FlatXmlDataSetBuilder flatXmlDataSetBuilder = new FlatXmlDataSetBuilder(); 
     flatXmlDataSetBuilder.setColumnSensing(true); 
     dataset = flatXmlDataSetBuilder.build(new FileInputStream(datasetPath)); 
    } 

    @AfterMethod 
    public void cleanDB() throws Exception { 
     em.getTransaction().begin(); 
     DatabaseOperation.CLEAN_INSERT.execute(connection, dataset); 
     em.getTransaction().commit(); 
    } 
} 

Kết quả của việc này là sau XMLDataSet (dữ liệu bỏ qua):

<dataset> 
    <administrable/> 
    <serviceuser/> 
    <usergroup/> 
</dataset> 

Khi TestNG thực thi @AfterMethod, tôi nhận được sau Ngoại lệ:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException 
Cannot delete or update a parent row: a foreign key constraint fails (`testing_db`.`serviceuser`, CONSTRAINT `FK_gyylcfbhpl2ukqs5rm7sq0uy8` FOREIGN KEY (`userGroup_id`) REFERENCES `usergroup` (`id`)) 

Trả lời

11

Vấn đề là XMLDataSet Tôi đã tạo ở trên không biết ràng buộc khóa ngoài trong bảng và tạo danh sách bảng theo thứ tự bảng chữ cái. Tuy nhiên, thao tác CLEAN_INSERT mất danh sách các bảng và truyền tải nó theo thứ tự ngược lại và yêu cầu các tham chiếu khóa ngoài (ở đây: ServiceUser.userGroup_id) phải được xóa trước đối tượng được tham chiếu (ở đây: UserGroup).

tôi tìm thấy thông tin này thông qua Unitils doesn't workhttp://forum.spring.io/forum/spring-projects/data/12868-dbunit-test-fails-mysql-server-hates-me?p=337672#post337672

Một số đào nhỏ vào tài liệu DbUnit dẫn đến một cách tiếp cận điều chỉnh để tạo ra các tập dữ liệu, trong đó kiểm tra phụ thuộc chính nước ngoài và cố gắng để đặt hàng các đối tượng thích hợp:

IDataSet fullDataSet = new FilteredDataSet(new DatabaseSequenceFilter(connection), connection.createDataSet()); 

Kết quả:

<dataset> 
    <administrable/> 
    <usergroup/> 
    <serviceuser/> 
</dataset> 

chí này CLEAN_INSERT chính xác.

Tuyên bố từ chối trách nhiệm: Tôi đã không gặp phụ thuộc vòng tròn hoặc tự tham chiếu khóa ngoại, và tôi chưa thử nghiệm rằng bản sửa lỗi này có thể xử lý chúng.

+0

Bạn đã đặt đoạn mã ở đâu? –

+0

Tôi không chắc chắn những gì bạn đang yêu cầu. Tôi không nói bất cứ điều gì về một đoạn mã, và tất cả các mã có liên quan có sẵn trong một trong hai câu hỏi hoặc câu trả lời. – blagae

+0

Đoạn mã IDataSet bạn đang sử dụng. Trong tập tin nào bạn đã đặt nó? –

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