spticad / mpic-movies

4 stars 3 forks source link

Тестирование слоя доступа к данным #25

Closed vitalyivanov closed 10 years ago

vitalyivanov commented 10 years ago

Должно быть что-то наподобие http://tillias.wordpress.com/2012/11/10/unit-testing-and-integration-testing-using-junit-liquibase-hsqldb-hibernate-maven-and-spring-framework/.

AlexMfill commented 10 years ago

https://code.google.com/p/deep-equals/

AlexMfill commented 10 years ago

Ни в H2 DataBase, ни в HSQL DataBase нет возможности использовать returning в запросе insert. Поэтому необходимо либо переделывать все запросы, либо выполнять тестирование с использованием PostgreSQL. Как вариант:

@SqlUpdate("insert into movies(title, imdb_id, imdb_picture_url) " +
        "values (:title, :imdb_id, :imdb_picture_url)")
void insert(@Bind("title") String title, @Bind("imdb_id") String imdbId,
            @Bind("imdb_picture_url") String imdbPictureURL);
@SqlQuery("select lastval()")
long selectId();

@Test public void testInsert() throws Exception { dao.insert("Casper 4","tt4", "url 4"); ITable actual = dbInitializer.getActualTable("movies"); ITable expected = dbInitializer.readDataSet("datasets/after-insert-movie.xml").getTable("movies"); Assertion.assertEquals(expected, actual); long actualId = dao.selectId(); long expectedId=4; Assert.assertEquals(expectedId, actualId); }

Только нужно будет изменить получение значения expectedId

vitalyivanov commented 10 years ago

По поводу deep-equals. В нашем случае достаточно переопределить equals и hashCode. Подробнее про эти методы тут http://habrahabr.ru/post/168195/. Для получения id вставленной записи лучше использовать GeneratedKeys. Уже поправил.

AlexMfill commented 10 years ago

Возник вопрос. А как тестировать пользователя и рейтинг (добавление новой записи)? При создании пользователя, время ему задается текущее, но мы не можем предугадать конкретное время и поставить его в предполагаемый dataset.

vitalyivanov commented 10 years ago

Можно использовать Assertion.assertEqualsIgnoreCols, игнорируя колонку со временем. Но при этом в том же методе добавить какую-нибудь логику проверки времени, хотя бы что оно != null.

vitalyivanov commented 10 years ago

Время теперь передается через параметром из java логики. Это упращает тестирование. Проблема с users возникала из-за того, что DbUnit получал метаинформацию о колонках этой таблицы как из нашей схемы, так и из служебной схемы H2. Поправил явно указав схему PUBLIC, где и хранится наша таблица.