В настоящее время я работаю над приложением на основе пружины. У меня есть некоторые модульные тесты для многих целей приложения. Проблема в том, что я не нашел никакого решения для проведения реального интеграционного теста в моем приложении.
Позвольте привести пример:
В моих текущих тестах я настраиваю запрос для конкретного контроллера и передаю эти компоненты моему обработчику:
// setup request
request.setMethod("GET");
request.setRequestURI("/customer");
request.addHeader("Accept", "application/json");
request.addHeader("Authorization", "Basic xyz"); // base_64
handlerAdapter.handle(request, response, myController);
Но это не настоящий интеграционный тест, потому что я говорю: хорошо, у меня есть запрос, и myController должен обработать этот запрос.
Это проблема, потому что я действительно хочу проверить следующее:
У меня есть запрос, и мое приложение должно обработать этот запрос. Я не хочу указывать контроллер, потому что в случае работающего приложения и запроса к «/ customer» Spring отправляет, какой контроллер решает мой запрос.
Я действительно хочу смоделировать, что я являюсь браузером или другим клиентом, отправляющим запросы в мой бэкэнд.
Причина, по которой я хочу это проверить, заключается в том, что в противном случае некоторые виды тестов проходят, хотя проверенная функциональность не работает в "реальном мире"
Я мог бы дать вам этот пример, чтобы понять, чем тесты отличаются от производственного цикла:
Предположим, у меня есть загрузка файла в форме с параметром. Вот моя функция контроллера:
@RequestMapping(value="/{id}", method = RequestMethod.PUT, headers="content-type=multipart/form-data")
public ResponseEntity<String> createFromMyForm(@PathVariable("id") Long id, @RequestParam String myParameter, @RequestParam MultipartFile myFile) {
//...
}
Посмотрите на RequestMethod.PUT, это не работает в производственной сборке, потому что стандарт HTML для загрузки файлов - это POST.
В моем модульном тесте я делаю это:
// setup request
MockMultipartHttpServletRequest multipartRequest = new MockMultipartHttpServletRequest();
MockHttpServletResponse multipartResponse = new MockHttpServletResponse();
// Open file
final FileInputStream fis = new FileInputStream("img/test.png");
MockMultipartFile multipartFile = new MockMultipartFile(
"myParameter", fis);
// generate multipart mock
multipartRequest.addFile(multipartFile);
multipartRequest.addParameter("json", "test");
// send request
handlerAdapter.handle(multipartRequest, multipartResponse, controller);
Проблема: тест проходит, а не должен. Причин, по которым этот тест проходит, несколько. Сначала я уточняю запрос. Я не говорю, что у меня есть запрос, но вместо этого я должен сказать, что у меня есть MultipartRequest. Это приводит к тому, что сервлет диспетчера возвращает true в функции, называемой что-то вроде isMultipartRequest (). В производственном прогоне возвращается false, потому что в методах PUT нет многочастных запросов. Далее я снова указываю контроллер, который должен обрабатывать этот запрос.
Может быть, есть и другие примеры, но я хочу сказать, есть ли способ протестировать мое приложение в реальных условиях, включая мой протокол html и все остальное?
Буду очень признателен за любую помощь!
Заранее спасибо