Юрий Юрий
Я всегда думал что mockMvc заточен под функциональные тесты...
С MockMvc по дефолту вообще http-сервер не поднимается в спринге (если не указать webEnvironment в аннотации).
Вообще, это довольно странное решение и вызывает много вопросов. Код выглядит так, будто бы тестирует HTTP-запрос, а по факту тестирует частично десериализацию запроса, частично контроллер, частично сериализацию ответа.
Из-за того, что не поднимается http-сервер, не работают, в частности, резолвинг эксепшенов через forward на /error, что по дефолту используется в Spring-Boot для сериализации ответа в случае возникновения любого exception. Вместо этого просто выбросится эксепшен, который выбрасывается из контроллера. Так что для проверки контракта http api MockMvc плохо подходит в таком виде.
С WebEnvironment.RANDOM_PORT - совсем другое дело. Поднимается полноценный http-сервер и можно тестировать контракт, включая ответы при ошибках. Такие тесты, конечно, выполняются дольше и т.д., но они все равно обычно нужны. А когда они уже есть, то писать еще дополнительные MockMvc тесты без WebEnvironment.RANDOM_PORT выглядит, как оверкил. По сути, единственной их целью в таком случае будет: проверить логику контроллера, замокав различные варианты действий сервис-слоя. Но, как правило, даже если в контроллере есть какая-то логика, она всегда влияет на http-ответ. Так что эти сценарии все равно покроются "настоящими" тестами с WebEnvironment.RANDOM_PORT.