Как написать тестовый метод для ResultSetExtractor, используя mockito? - PullRequest
0 голосов
/ 05 марта 2019

Как написать метод в классе 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 Ответ

0 голосов
/ 05 марта 2019

Возможность 1:

Извлеките свой ResultSetExtractor в его собственный класс, что значительно упрощает его тестирование, чем в качестве анонимного внутреннего класса.

Возможность 2:

Выполните макет jdbcTemplate, создайте ArgumentCaptor, вызовите метод и затем выполните ...

Mockito.verify(this.jdbcTemplate).query(any(), any(), captor.capture());

Это позволяет вамчтобы затем получить ResultSetExtractor из ArgumentCaptor и запустить тесты для этого.Но это усложняет весь ваш тест, поэтому я по-прежнему предлагаю возможность 1.

Возможность 3:

Проверка всего этого на базе данных в памяти, тестирование ResultSetExtractorтолько косвенно.Поскольку это, кажется, Spring, есть простые способы сделать это, но, конечно, ваш модульный тест теперь будет включать в себя целый SpringApplicationContext, db и т. Д., Что делает его медленнее, чем «чистый» модульный тест только с ложными попытками.Так как это что-то, что запускает запросы к БД, вам в любом случае потребуется запустить его на БД, в противном случае ваши тесты на самом деле не будут завершены (имитация его с помощью mocks хороша для основ, но не то же самое).

...