Closed TemirlanSadykov closed 4 years ago
ушло 12:30 часов так как пришлось изучить тонну информации, несколько раз перечитывать, попробовать разные варианты тестов.
Ссылки на изученные материалы: (https://reflectoring.io/spring-boot-web-controller-test/) (https://www.youtube.com/watch?v=kXhYu939_5s&t=1s) (https://www.springboottutorial.com/spring-boot-unit-testing-and-mocking-with-mockito-and-junit) (https://www.north-47.com/knowledge-base/testing-spring-boot-application/) (https://www.logicbig.com/tutorials/spring-framework/spring-boot/boot-web-application-testing-with-mock-mvc.html) (https://dzone.com/articles/testing-entity-validations) (https://medium.com/@konstantinnalum/input-validation-and-unit-testing-of-a-rest-controller-in-spring-boot-304b82ca7526) (https://medium.com/backend-habit/integrate-junit-and-mockito-unit-testing-for-controller-layer-91bb4099c2a5) (https://reflectoring.io/bean-validation-with-spring-boot/) (https://examples.javacodegeeks.com/enterprise-java/spring/boot/spring-boot-cucumber-tests-example/) (https://moelholm.com/blog/2016/10/15/spring-boot-gherkin-tests)
Мои варианты:
работающий вариант, но он занимал много времени для запуска и решил использовать моки
этот вариант использует мок, но я так понял что моками валидации нельзя проверять, так как, если не ошибаюсь, ими симулируют что то, например в первом методе я написал name согласно валидации, и в when/then написал что жду ошибку, хотя ошибки быть не должно, но assert сработал. Кстати в сейчас он thenThrow, раньше он был then(returnFirstArg()) я думал что returnFirstArg() вернет создаваемый обьект, но он не сработал и потратил это тоже много времени и потом только поменял на thenThrow
когда я гуглил spring validation test, почти во всех ссылок проверялись контроллеры а не сервисы, решил попробовать.
первая проблема это как показано в ссылках я указал аннотацию @WebMvcTest(PositionController.class), и при запуске теста выходило ошибка "failed to load application context" а ниже говорилось что Datasourсe не запущен. Я создать класс и через него запустить datasourse не получалось,на решение этой проблемы я потратил 2 часа а то и больше, я думал что проблема в datasource и гуглил про это, но я когда загуглил "failed to load application context" то узнал надо ставить аннотацию @AutoConfigureMockMvc
вторая проблема в andExpect ожидалось какой то статус, но createPosition в любом случае был ридайрект на другую страницу, этот вариант сработал бы если в методе не было ридайректов и выдавал 200 или 4xx, потом я попробовал в andExpect атрибут errors но он выходил true в случае ошибки и без, и тем более csrf был включен его тоже надо было ввести я не знал как,
этот вариант проверяет аннотации а не бизнес логику. он не подходил
Вывод: Я вернулся в первому варианту, возможно я в начале не правильно понял что такое мок, сюдя по моим тестам я предположил что они для симуляции чего то и не подходит для теста валидации, в случае с контроллерами он сработал бы если в методе createPosition не было ридайректов
Что нужно сделать? Изучить и пересоздать тесты для валидации для сервиса PositionService для всех методов.
Для чего это нужно? Нужно для проверки верности работы методов сервиса PositionService, т.к. в прошлый раз мы не до конца изучили весь функционал тестов.
Как понять, что задача решена? Получить тест, для валидации для сервиса PositionService.
Планируемое время 6 часов 30 минут