Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JUnit.Подскажите как правильно написать тест для DAO / 6 сообщений из 6, страница 1 из 1
10.12.2013, 21:26:53
    #38496235
justcoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JUnit.Подскажите как правильно написать тест для DAO
Всем, здравствуйте. В общем имеется DAO

Код: java
1.
2.
3.
4.
public interface MarkDAO {
    public Mark insertMark(Mark mark);
    public Mark getMarkById(long markId);
}



Пишу для этого дао тест (предварительно создав для тестов отдельный спринговой контекст, который замаплен на тестовую базу). Итак сам тест

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/test-context.xml")
@TransactionConfiguration(transactionManager = "transactionManager")
@Transactional
public class MarkDaoJdbcImplTest {

    @Autowired
    private MarkDAO markDAO;

    @Test
    public void testInsertMark(){
        Mark expectedMark=createTestMark();
        expectedMark=markDAO.insertMark(expectedMark);

        Mark factMark=markDAO.getMarkById(expectedMark.getId());
        assertMarksEquals(expectedMark,factMark);
    }

    @Test
    public void testGetMarkById(){
        Mark expectedMark=createTestMark();
        expectedMark=markDAO.insertMark(expectedMark);

        Mark factMark=markDAO.getMarkById(expectedMark.getId());
        assertMarksEquals(expectedMark,factMark);
    }

    private Mark createTestMark(){
        Mark mark=new Mark();
        mark.setName("Test mark");
        return mark;
    }

    public void assertMarksEquals(Mark expected,Mark fact){
        assertEquals(expected.getName(),fact.getName());
    }
}


В общем не нравится мне то как тут сделано, помимо тупого дублирования оба метода зависят друг от друга.

Есть ли смысл тут писать SQL,что-то типа этого

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public void testGetMarkById(){
        Mark expectedMark=createTestMark();
        String sql="INSERT INTO MARK....";
        KeyHolder keyHolder......
        jdbcTemplate.query(sql,createParamsMap(expectedMark),keyHolder,new String[]{"MARK_ID"});
        expectedMark.setId(keyHolder.getLongValue());
        Mark factMark=markDAO.getMarkById(expectedMark.getId());
        assertMarksEquals(expectedMark,factMark);
    }


, ну в общем как правильно (желательно с обоснованием) писать тесты для такого вот случая. Направьте на путь истинный.
...
Рейтинг: 0 / 0
10.12.2013, 21:45:53
    #38496243
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JUnit.Подскажите как правильно написать тест для DAO
justcoder, ну в общем как правильно (желательно с обоснованием) писать тесты для такого вот случая. Направьте на путь истинный.Вы думаете есть единственно правильный путь? ) Я, например, предпочитаю тестировать уровень сервисов, а не DAO. И данные "накидывать" руками, точнее с помощью DbUnit. Возможно, Вам понравится иначе...
...
Рейтинг: 0 / 0
11.12.2013, 10:16:24
    #38496529
пролетевший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JUnit.Подскажите как правильно написать тест для DAO
justcoder, ваш тест проверяет Spring и Hibernate. Совершенно бессмысленно, они покрыты тестами очень хопошо, на все случаи жизни. Единственно что имеет смысл проверять, это насколько правильно данные отображаются в базе. Соответственно, если тестируем чтение то данные вставляем через SQL, если запись то проверяем через select. Это имеет смысл, чтобы проверить не ошиблись ли с мапингом, правильно ли сопоставляются типы ( вроде обрезки времени с типом date ), заполнение коллекций.
Я правда предпочитаю не dbunit ( лень заполнять yaml/xml ), а скриптами. А следующий уровень тестировать подставляя вместо DAO mock объекты.
...
Рейтинг: 0 / 0
11.12.2013, 14:33:42
    #38497044
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JUnit.Подскажите как правильно написать тест для DAO
пролетевшийjustcoder, ваш тест проверяет Spring и Hibernate. Совершенно бессмысленно, они покрыты тестами очень хопошо, на все случаи жизни. Единственно что имеет смысл проверять, это насколько правильно данные отображаются в базе.HQL-запросы в DAO полезно проверить.
...
Рейтинг: 0 / 0
11.12.2013, 15:17:56
    #38497138
justcoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JUnit.Подскажите как правильно написать тест для DAO
пролетевшийjustcoder, ваш тест проверяет Spring и Hibernate. Совершенно бессмысленно, они покрыты тестами очень хопошо, на все случаи жизни. Единственно что имеет смысл проверять, это насколько правильно данные отображаются в базе. Соответственно, если тестируем чтение то данные вставляем через SQL, если запись то проверяем через select. Это имеет смысл, чтобы проверить не ошиблись ли с мапингом, правильно ли сопоставляются типы ( вроде обрезки времени с типом date ), заполнение коллекций.
Я правда предпочитаю не dbunit ( лень заполнять yaml/xml ), а скриптами. А следующий уровень тестировать подставляя вместо DAO mock объекты.

У меня нету никакого hibernate, я юзаю голый sql обернутый в springJdbcTemplate
...
Рейтинг: 0 / 0
11.12.2013, 16:34:02
    #38497313
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JUnit.Подскажите как правильно написать тест для DAO
1)грузите в in-memory базу порцию тестовых данных (1 строка) используя DBunit в тесте делаете getX() сравниваете ожидаемое с полученным.
2) в тесте делаете insertX(), сравниваете текущее состояние базы и ожидаемым(xml файл с 1 строчкой) используя DBunit.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JUnit.Подскажите как правильно написать тест для DAO / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]