Как протестировать "добавить" в DAO без использования "найти"и т. д.?

в следующем коде проблема в том, что я не могу проверить Дао.add () без использования Дао.список.)(size () и наоборот.

является ли этот подход нормальным или неправильным? Если неверно, то как его можно улучшить?

public class ItemDaoTest {

    // dao to test
    @Autowired private ItemDao dao;

    @Test 
    public void testAdd() {
        // issue -> testing ADD but using LIST

        int oldSize = dao.list().size();
        dao.add(new Item("stuff"));
        assertTrue (oldSize < dao.list().size());
    }

    @Test
    public void testFind() {
        // issue -> testing FIND but using ADD

        Item item = new Item("stuff")
        dao.add(item);
        assertEquals(item, dao.find(item.getId()));
    }
}

4 ответов


Я думаю, что ваш тест-это действительные интеграционные тесты, как указано выше, но я бы использовал Add для помощи в тестировании Find и vice verse.. На каком-то уровне вы должны позволить себе доверять самому низкому уровню интеграции с вашей внешней зависимостью. Я понимаю, что в ваших тестах есть зависимость от других методов, но я нахожу, что методы Add и Find-это методы "низкого уровня", которые очень легко проверить. Они по существу проверяют друг друга, поскольку они в основном обратные методы.

Add может легко создавать предварительные условия для find

Find может проверить, что добавление было успешным.

Я не могу придумать сценарий, когда сбой в любом из них не будет пойман вашим тестом


ваш метод testAdd имеет проблему: это зависит от предположения, что ItemDao.список функционирует правильно, и все же ItemDao-это класс, который вы тестируете. Модульные тесты должны быть независимыми, поэтому лучше использовать простой JDBC-как сказал @Amir - для проверки, была ли запись введена в базу данных.

Если вы используете весну, то вы можете передать дальше AbstractTransactionalDataSourceSpringcontexttests для доступа к объектам JDBCTemplate и обеспечения отката после тест был выполнен.


Я использую direct JDBC (используя Jdbctemplate Spring) для тестирования методов DAO. Я имею в виду, что я вызываю методы DAO (которые являются Hibernate base), а затем подтверждаю их с помощью прямых вызовов SQL JDBC.


самый маленький тестируемый модуль для модульного тестирования на основе класса-это класс.

чтобы понять, почему, подумайте, что вы могли бы теоретически протестировать каждый метод класса в изоляции от всех других методов, обходя, колоть или издеваться над ними. Некоторые инструменты могут этого не поддерживать; это теория, а не практика, предположим, что они это делают.

тем не менее, делать что-то таким образом было бы плохой идеей. Спецификация индивидуальной функции сама по себе будет варьироваться между смутно бессмысленным и дословно непонятно. Только в шаблоне взаимодействия между различными функциями будет существовать спецификация, более простая, чем код, который вы можете с пользой использовать для ее тестирования.

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