Я использую DBUnit 2.6.0 с PostgreSQL 10 для заполнения моих таблиц методом setUp для моих тестов.
Когда я впервые попробовал это сделать, я получил исключение NoSuchColumnException, несмотря на то, что мой набор данных кажется правильным:Вот структура таблицы, в которую я пытаюсь поместить данные:
CREATE TABLE "user_profil" (
"nni" VARCHAR(8) NOT NULL,
"profile" VARCHAR(12) NOT NULL,
"perimetre" VARCHAR(50) NOT NULL,
"creadate" TIMESTAMP NULL,
"modifdate" TIMESTAMP NULL,
PRIMARY KEY ("nni", "profile", "perimetre")
)
Вот мой плоский XML-файл:
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<user_profil nni="TEST001" profile="support" perimetre="info1"/>
<user_profil nni="TEST002" profile="admin" perimetre="info1" />
</dataset>
Мой тестовый класс:
public class ThisIsATest extends TestConfig {
protected static IDatabaseTester dbTester;
@BeforeAll
public static void setUpBeforeClass(TestInfo testInfo) throws Exception {
dbTester = createDatabaseTester();
}
@BeforeEach
protected void setUpBeforeEach(TestInfo testInfo) throws Exception {
IDataSet dataSet = new FlatXmlDataSetBuilder().build(DatabaseLoadingUtil.getTestXmlFile());
dbTester.setDataSet(dataSet);
dbTester.setSetUpOperation(DatabaseOperation.REFRESH);
dbTester.onSetup();
}
@AfterEach
protected void tearDownAfterEach(TestInfo testInfo) throws Exception {
dbTester.setTearDownOperation(DatabaseOperation.DELETE);
dbTester.onTearDown();
}
private static IDatabaseTester createDatabaseTester() {
IDatabaseTester tester = null;
tester = new DataSourceDatabaseTester(getDataSource(), getJDBCUser())
{
@Override
public IDatabaseConnection getConnection() throws Exception
{
IDatabaseConnection connection = super.getConnection();
connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new PostgresqlDataTypeFactory());
return connection;
}
};
return tester;
}
private static DataSource getDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(getJDBCDriverClassName());
dataSource.setUrl(getJDBCURL());
dataSource.setUsername(getJDBCUser());
dataSource.setPassword(getJDBCPassword());
return dataSource;
}
@Test
public void testSomething {
// test
}
}
И вот ошибка, которую я получаю:
org.dbunit.dataset.NoSuchColumnException: user_profil.NNI - (Non-uppercase input column: nni) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive.
Когда я запустился в режиме отладки, я понял, что DBUnit не удалось получить столбцы таблиц в БД, поэтому, когда он проверяет,столбцы набора данных присутствуют в таблице в базе данных, это не удается.Я видел, что мне пришлось установить свойство для PostgreSQL, чтобы избежать его, но, как вы можете видеть, я сделал (connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new PostgresqlDataTypeFactory());
), но он все еще не работает.
Я попытался сгенерировать DTD, представляющий мойСхема базы данных (чтобы включить ее в файл flatXml, потому что она настоятельно рекомендуется в документации DBUnit), используя это:
FlatDtdDataSet.write(connection.createDataSet(), new FileOutputStream("test.dtd"));
Это сгенерировало «правильное» DTD моей базы данных, но только с таблицамиимена без столбцов:
<!ELEMENT dataset (
application*,
user*,
user_profil*)>
<!ELEMENT application EMPTY>
<!ATTLIST application
>
<!ELEMENT user EMPTY>
<!ATTLIST user
>
<!ELEMENT user_profil EMPTY>
<!ATTLIST user_profil
>
Моя последняя мысль - это то, что это может быть связано с подключением к самой базе данных, но это те же свойства JDBC, которые используются другой программой для доступа к БД, и работает нормально..
Я пытаюсь найти решение, но сейчас я немного отчаялся ...
У кого-то есть идея?