Closed vitalyivanov closed 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
По поводу deep-equals. В нашем случае достаточно переопределить equals и hashCode. Подробнее про эти методы тут http://habrahabr.ru/post/168195/. Для получения id вставленной записи лучше использовать GeneratedKeys. Уже поправил.
Возник вопрос. А как тестировать пользователя и рейтинг (добавление новой записи)? При создании пользователя, время ему задается текущее, но мы не можем предугадать конкретное время и поставить его в предполагаемый dataset.
Можно использовать Assertion.assertEqualsIgnoreCols, игнорируя колонку со временем. Но при этом в том же методе добавить какую-нибудь логику проверки времени, хотя бы что оно != null.
Время теперь передается через параметром из java логики. Это упращает тестирование. Проблема с users возникала из-за того, что DbUnit получал метаинформацию о колонках этой таблицы как из нашей схемы, так и из служебной схемы H2. Поправил явно указав схему PUBLIC, где и хранится наша таблица.
Должно быть что-то наподобие http://tillias.wordpress.com/2012/11/10/unit-testing-and-integration-testing-using-junit-liquibase-hsqldb-hibernate-maven-and-spring-framework/.