SpringBoot — Использование RestTemplate внутри @Service

#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-ответы. Мои конкретные вопросы таковы:

  1. Правильно ли использовать ResponseEntitylt;gt;lt;gt;, как описано в примере?
  2. Как я мог бы создать модульный тест для уровня @Service без использования MockMvc? Не имеет особого смысла использовать его на уровне @Service.

Заранее спасибо.

Ответ №1:

  1. Я бы не стал, я бы оставил это на усмотрение Диспетчера. Службы должны обрабатывать вашу бизнес-модель, а не конкретные объекты для HTTP-ответов.
  2. Поскольку MyDirectServiceImpl не имеет зависимости, это простой модульный тест. Просто создайте его в своем модульном тесте и действуйте в соответствии с каждым из общедоступных методов, которые вы хотите протестировать, и подтвердите их возвращаемые значения.