#spring-boot #resttemplate
Вопрос:
Недавно я нашел проект, в котором мне нужно создать несколько модульных тестов. Проблема в том, что на каждом методе @RestController автоматически подключается к уровню @Service, что нормально, но @Service возвращает объекты ResponseEntitylt;?gt;lt;?gt; в результате вызова внешнего API, пример ниже:
Контроллер покоя:
@Slf4j @RestController public class AppEntryPoint { @Autowired MyDirectService myDirectService; @PostMapping("/create-identity") public ResponseEntitylt;?gt; createIdentity(HttpServletRequest httpServletRequest) throws RestException, IOException { return myDirectService.createIdentity(httpServletRequest); } }
Обслуживание:
@Slf4j @Service public class MyDirectServiceImpl implements MyDirectService { @Override public ResponseEntitylt;Stringgt; createIdentity(HttpServletRequest httpServletRequest) throws RestException, IOException { String url = "https://mymockserver.com/entity"; return processTransaction(url, httpServletRequest, false); } private ResponseEntitylt;Stringgt; processTransaction(String url, HttpServletRequest httpServletRequest, boolean accessToken) throws RestException, IOException { String requestBody = getRequestBody(httpServletRequest); HttpHeaders headers = addHeaders(accessToken); ResponseEntitylt;Stringgt; response = httpUtil.call((url), requestBody, headers); log.info("Response: {}", response); return response; } }
Мне кажется немного странным использовать ResponseEntity внутри @Service, поскольку ResponseEntity, скорее всего, будет обрабатывать HTTP-ответы. Мои конкретные вопросы таковы:
- Правильно ли использовать ResponseEntitylt;gt;lt;gt;, как описано в примере?
- Как я мог бы создать модульный тест для уровня @Service без использования MockMvc? Не имеет особого смысла использовать его на уровне @Service.
Заранее спасибо.
Ответ №1:
- Я бы не стал, я бы оставил это на усмотрение Диспетчера. Службы должны обрабатывать вашу бизнес-модель, а не конкретные объекты для HTTP-ответов.
- Поскольку
MyDirectServiceImpl
не имеет зависимости, это простой модульный тест. Просто создайте его в своем модульном тесте и действуйте в соответствии с каждым из общедоступных методов, которые вы хотите протестировать, и подтвердите их возвращаемые значения.