95shuma / crm

3 stars 0 forks source link

Создать тесты для валидации для сервиса PositionService. #64

Closed TemirlanSadykov closed 4 years ago

TemirlanSadykov commented 4 years ago
urmat-mederbekov commented 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)

Мои варианты:

Без названия

работающий вариант, но он занимал много времени для запуска и решил использовать моки

Без названия (1)

этот вариант использует мок, но я так понял что моками валидации нельзя проверять, так как, если не ошибаюсь, ими симулируют что то, например в первом методе я написал name согласно валидации, и в when/then написал что жду ошибку, хотя ошибки быть не должно, но assert сработал. Кстати в сейчас он thenThrow, раньше он был then(returnFirstArg()) я думал что returnFirstArg() вернет создаваемый обьект, но он не сработал и потратил это тоже много времени и потом только поменял на thenThrow

Без названия (2)

когда я гуглил 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 был включен его тоже надо было ввести я не знал как,

Без названия (3)

этот вариант проверяет аннотации а не бизнес логику. он не подходил

Вывод: Я вернулся в первому варианту, возможно я в начале не правильно понял что такое мок, сюдя по моим тестам я предположил что они для симуляции чего то и не подходит для теста валидации, в случае с контроллерами он сработал бы если в методе createPosition не было ридайректов