Вопрос по datasource, mockito, jdbctemplate, mocking, java – Mocking DataSource для JdbcTemplate с Mockito

2

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

Класс яЯ работаю с имеетJdbcTemplate template переменная класса, которая создается следующим образом:

setJdbcTemplate(DataSource dataSource) {
    this.template = new JdbcTemplate(dataSource);
}

Метод, который я хотел бы проверить, делаетtemplate.query(<code>)</code> выполнить определенный запрос SQL и вернуть результаты в список.

Я создал следующее в моем тестовом примере, но яЯ не уверен, как его использовать. Можно ли заставить следующий код возвращать определенный список строк, используя Mockito?

<code>DataSource mockedDataSrc = Mockito.mock(DataSource.class);
customerClassDao.setJdbcTemplate(mockedDataSrc); 
</code>

Могу ли я как-то использовать<code>when</code> или другая команда для установки того, что я хочу вернуть в JdbcTemplate<code>.query</code> вызов?

Ваш Ответ

2   ответа
2

JdbcTemplate реализация. Вы должны зависимость вводитьJdbcTemplate а потом издеватьсяJdbcTemplate вместо.

Эта трудность указывает на проблему с вашим кодом. Ваш код зависит от конкретного экземпляраJdbcTemplate, Это было бы менее связанным, если бы вы использовали вместо этого Dependency Injection.

Так как ты неЕсли вы хотите изменить тестируемую систему, вы можете сделать это:

Изменитьtemplate поле так оно и естьs пакет защищен (то есть: удалить приватное ключевое слово). Затем я'я установил его как макет (JdbcTemplate.class) после создания экземпляра класса, который выповторное тестирование. Теперь ваша очередь'Вы сможете использовать когда и проверить на JdbcTemplate напрямую, как вы хотели изначально.

Так класс тыПовторное тестирование будет выглядеть так:

public class SystemUnderTest {

JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(DataSource dataSource) {
        this.template = new JdbcTemplate(dataSource);
    }

}

И ваш тест сделает это:

@Before
public void setUp() {
    SystemUnderTest sut = new SystemUnderTest();
    sut.jdbcTemplate = mock(JdbcTemplate.class);                
}

// ...
Ваш тест дает сбой, если вы издеваетесь над источником данных и передаете его прямо сейчас? Если нет, то естьЕсть кое-что, что вы можете сделать, но мне нужно знать это в первую очередь. Daniel Kaplan
Смотри мое редактирование пожалуйста Daniel Kaplan
Спасибо, это направило меня в правильном направлении. Очень ценится. Kyle
Источник данных внедряется через Spring через applicationContext.xml. Я'Я не уверен, почему они решили просто вставить источник данных вместо jdbcTemplate, но я пытался протестировать мой метод, который я написал, без необходимости изменять / реорганизовывать слишком много кода. Поскольку мое изменение действительно влияет только на 1 вызов SQL в 1 методе. Kyle
Это не сбой, это просто говорит об успешном. Я просто неТ куда идти отсюда, яЯ очень плохо знаком с Mockito / jUnit. Я'Гуглил несколько часов и до сих порЯ понял, куда идти, кроме двух строк, которые я показал выше. Kyle
3

При тестировании DAO нет никакого смысла издеваться над источником данных. Что ты тестируешь? Вам необходимо создать DAO, который взаимодействует с базой данных.

Как только у вас это сработает, выВы можете свободно издеваться над интерфейсом DAO при тестировании сервисов, которые его используют. Вы'мы уже проверили DAO; там'нет причин переделывать это при тестировании сервисов.

скажу тебене в курсе, если выповторно издеваться над источником данных при тестировании DAO.

Если DAO работает, вы можете либо высмеять ResultSet, либо включить RowMapper в тесты DAO. duffymo
Может быть полезно протестировать RowMapper или какой-либо другой код в DAO, который принимает набор результатов и создает что-то отличное от ванильного ответа на запрос. DomenicDatti

Похожие вопросы