#junit #mocking #mockito
#junit #издевательство #mockito
Вопрос:
Как написать метод в классе myDAOTest для тестирования моего класса DaoImpl с использованием Mockito? вот метод, который мне нужно протестировать из моего TestClass.
@Override
public myCustomResponse mymethod(String query, Map<String, Object> parameters) {
jdbcTemplate.query(query, parameters, new ResultSetExtractor<List<MyObject>>() {
@Override
public List<MyObject> extractData(ResultSet result) throws SQLException, DataAccessException {
try {
List<MyObject> myObject= new ArrayList<>();
while (result.next()) {
response = getResponseDetails(result);
}
return myObject;
} catch (SQLException sqlException) {
LOG.debug(MyConstants.DATABASE_EXCEPTION_MESSAGE);
throw new MyCustomeException(MyConstants.DATABASE_EXCEPTION_MESSAGE);
}
}
});
}
return response;
}
Ответ №1:
Возможность 1:
Извлеките ваш ResultSetExtractor в его собственный класс, что значительно упрощает тестирование, чем в качестве анонимного внутреннего класса.
Возможность 2:
Смоделируйте JdbcTemplate, создайте ArgumentCaptor, вызовите метод и затем выполните…
Mockito.verify(this.jdbcTemplate).query(any(), any(), captor.capture());
Это позволяет вам затем получить ResultSetExtractor из ArgumentCaptor и запустить тесты на нем. Но это усложняет весь ваш тест, поэтому я все еще предлагаю вариант 1.
Возможность 3:
Протестируйте все это на базе данных в памяти, протестировав ResultSetExtractor только косвенно. Поскольку это, похоже, Spring, есть простые способы сделать это, но, конечно, ваш модульный тест теперь будет включать весь SpringApplicationContext, базу данных и т.д., Что делает его медленнее, чем «чистый» модульный тест с использованием только mocks. Поскольку это то, что запускает запросы к БД, вам все равно нужно будет некоторое время запускать его с БД, иначе ваши тесты на самом деле не будут полными (имитация этого с помощью mocks хороша для основ, но это не одно и то же).