Spring Web Unit test - Как вывести базу данных в известное состояние? - PullRequest
2 голосов
/ 03 января 2012

Как видно из названия, я хочу перевести свою базу данных в "известное состояние", чтобы применить модульный тест.Я могу удалить - заново создавать свою базу данных каждый раз перед запуском модульного теста, но есть ли лучший способ?

Мое веб-приложение в настоящее время работает с контекстом Spring и Hibernate.

Ответы [ 2 ]

3 голосов
/ 03 января 2012

Я бы посоветовал вам использовать инструмент под названием DBUnit , который предназначен именно для того, что вы ищете. В Интернете есть множество примеров использования его с Spring & Hibernate.

Для загрузки данных:

@Before
public void onSetUpInTransaction() throws Exception {
    Connection conn = dataSource.getConnection();
    try {
        IDatabaseConnection connection = new DatabaseConnection(conn);
        DatabaseConfig config = connection.getConfig();
        config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
                new HsqldbDataTypeFactory());
                    DataFileLoader loader = new FlatXmlDataFileLoader();
            IDataSet ds = loader.load(TEST_DATA_FILE_CLUB);
                    DatabaseOperation.CLEAN_INSERT.execute(connection,ds);
            } finally {
        DataSourceUtils.releaseConnection(conn, dataSource);
    }
}

Это возьмет файл XML, указанный в строке TEST_DATA_FILE_CLUB, и загрузит его в чистую копию базы данных в памяти.

Для очистки просто используйте другой метод с аннотацией @After и используйте вместо этого операцию базы данных DELETE_ALL.

Предполагая, что вы используете JUnit, размещение этих методов в вашем тестовом классе или в суперклассе, который могут расширять тестовые классы, позволит вам быстро настроить базу данных точно так, как вы хотите для каждого отдельного теста.

Файлы XML для загрузки просты:

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
    <competition competitionId="1" competitionName="Competition 1"
        senior="1" junior="0"/>
</dataset>

загрузит строку в таблицу соревнований со значениями столбцов, как указано. Старший и младший столбцы являются логическими значениями.

1 голос
/ 03 января 2012

Если вы проводите какие-то интеграционные тесты, попробуйте назначить тесты таким образом, чтобы каждый из них работал независимо от того, выйдет ли другой.

Тогда вам нужно настроить базу данных только один раз (до первого теста)

Кстати: я настоятельно рекомендую использовать другую базу данных (одну для разработки) и ту, которая используется только для тестов.

Больше технических деталей: * если вы используете встроенную базу данных для малых и средних тестов, вы можете использовать подпружиненную поддержку jdbc

<jdbc:embedded-database id="dataSource" type="H2" >
    <jdbc:script location="classpath:init.sql" />       
</jdbc:embedded-database>
  • для реальных (больших) интеграционных тестов вы можете использовать maven sql-maven-plugin
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...