Как написать метод тестирования для ResultSetExtractor с использованием mockito?

#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 хороша для основ, но это не одно и то же).