DBUnit 2.6.0: NoSuchColumnException - PullRequest
       25

DBUnit 2.6.0: NoSuchColumnException

1 голос
/ 24 сентября 2019

Я использую 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, которые используются другой программой для доступа к БД, и работает нормально..

Я пытаюсь найти решение, но сейчас я немного отчаялся ...

У кого-то есть идея?

...