Pytam i odpowiadam na to pytanie do przyszłego użytku, ponieważ uważam, że znalazłem przyzwoite rozwiązanie typowego problemu z DbUnit. Mam nadzieję, że pomaga komuś, gdzieś w dole.DbUnit nie może wyczyścić-wstawić: ograniczenie klucza obcego
Używam DbUnit 2.5.0
i TestNG 6.8.8
. Mój przypadek użycia dotyczy części bazy danych, która obejmuje 3 podmioty. Istnieje ServiceUser
, który zawiera klucz obcy zarówno dla Administrable
i UserGroup
.
Śledziłem większość przykład kodu z 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();
}
}
Wynikiem tego jest następujący XMLDataSet
(dane pominięta):
<dataset>
<administrable/>
<serviceuser/>
<usergroup/>
</dataset>
Kiedy TestNG
wykonuje @AfterMethod
, pojawia się następujący Wyjątek:
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`))
Gdzie umieściłeś fragment kodu? –
Nie jestem pewien, o co pytasz. Nie mówię nic o fragmencie kodu, a cały odpowiedni kod jest dostępny w pytaniu lub odpowiedzi. – blagae
Fragment kodu kodu IDataSet, z którego korzystałeś. W jakim pliku to umieściłeś? –