2014-09-30 25 views
5

Ben ileride başvurmak için bu soru sormak ve yanıtlamak, çünkü DbUnit ile ortak bir sorun için iyi bir çözüm bulduğumu düşünüyorum. Umarım birileri, hatta bir yerlere yardım eder.DbUnit temiz-insert başarısız: yabancı anahtar kısıtlaması

DbUnit 2.5.0 ve TestNG 6.8.8 kullanıyorum. Benim kullanım durumum 3 öğeden oluşan bir veritabanının bir parçası içindir. Hem Administrable hem de UserGroup için bir yabancı anahtar tutan bir ServiceUser vardır.

bu sonucu XMLDataSet (atlanmış veriler) takip 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(); 
    } 
} 

kod, örneğin en takip etti:

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

TestNG@AfterMethod yürütüldüğünde, aşağıdaki elde Özel durum:

cevap

11

Sorun, yukarıda oluşturulan XMLDataSet I, tablolardaki yabancı anahtar kısıtlamalarını bilmemesi ve tablo listesini alfabetik olarak oluşturmasıdır. Ancak, CLEAN_INSERT işlemi, tablo listesini alır ve ters sırayla hareket ettirir ve başvurulan varlıktan önce (burada: ServiceUser.userGroup_id) yabancı anahtar başvurularının silinmesini gerektirir (burada: UserGroup).

:

Ben DbUnit belgelerine içine bazı küçük kazma yabancı anahtar bağımlılıkları kontrol eder ve uygun kişiler sipariş etmeye çalışır veri kümesi oluşturmak için düzeltilmiş bir yaklaşıma yol açtı Unitils doesn't work ve http://forum.spring.io/forum/spring-projects/data/12868-dbunit-test-fails-mysql-server-hates-me?p=337672#post337672

aracılığıyla bu bilgiyi buldum

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

Sonuç:

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

Bu irade CLEAN_INSERT doğru.

Yasal Uyarı: Dairesel bağımlılıklar veya kendi kendini yönlendiren yabancı anahtarlara rastlamamıştım ve bu düzeltmenin bunları işleyebileceğini test etmedim.

+0

Kod snippet'ini nereye yerleştirdiniz? –

+0

Ne sorduğundan emin değilim. Bir kod parçacığı hakkında hiçbir şey söylemiyorum ve ilgili tüm kod soru veya cevapta kullanılabilir. – blagae

+0

Kullandığınız kod IDataSet snippet'i. Bunu hangi dosyaya koydun? –