Как мне протестировать свою службу, которая вызывает 3-стороннюю конечную точку rest?

#java #spring #spring-boot #integration-testing

Вопрос:

Я пытаюсь протестировать свою службу, которая отправляет запрос rest на стороннюю конечную точку rest, над которой издеваются во время интеграционного тестирования (предположим, что я знаю требуемый текст запроса). Приведенный код-это лишь приблизительный набросок того, чего я пытаюсь достичь. Сама конечная точка rest может быть недоступна не всегда, поэтому я хочу поиздеваться над ней. Давайте посмотрим на псевдокод:

Первый мой тестовый случай:

 public class FooExampleTest {

    private ExampleService exampleService;

    @BeforeEach
    void setup() {
        
        exampleService = new ExampleService();
        
    }

    @Test
    void example_TestCase() {

        SomeEntity entity = new SomeEntity();
        entity.setFoo("Foo!");
        // set more fields....
  
        // Calling the service containing the rest request to the 3rd party system
        exampleService.sendToClient(entity);

    }
}
 

Сервис, содержащий запрос к сторонней системе, высмеивается

 @Service
public class SomeServiceImpl {
  
    // some fields
    // ...
    @Autowired
    private RestTemplate restTemplate;


   // ......


    public void sendToClient(Entity entity){
        var uri = "http://localhost:8080/foo"
        var clientSystem = new ClientSystemRequest();
        clientSystem.setImportField(entity)
        log.info("Sending reqeust to client system");
        
        restTemplate.postForObject(uri, clientSystem, ClientSystemResponse.class);
    }

}

 

Конечная точка rest третьей стороны должна быть высмеяна во время интеграционного тестирования

 
@RestController
@Slf4j
/**
 * Mocks the 3rd party rest endpoint
 */
public class 3rdPartyClientsystemResourceTest {
    

    @PostMapping("/foo")
    public ResponseEntity<?> foo(@RequestBody @Valid ClientSystemRequest clientSystemRequest){
        log.info("Received, with data: {}", clientSystemRequest);
        
        // Do some sort of validation....

        return new ResponseEntity<>(HttpStatus.OK);
    }


}

 

Ответ №1:

Рассматривали ли вы возможность использования насмешливых фреймворков, таких как, например, Mockito? Затем вы могли бы просто издеваться restTemplate и проверять только логику вашего сервиса, а не его взаимодействие с API.

Если вы хотите провести интеграционный тест, вы должны сделать реальный вызов API. В противном случае это не интеграционный тест.

Комментарии:

1. Да, я рассматривал возможность использования Mockito. Ну, идея этого теста заключается в том, что все логические компоненты тестируются, и запрос, отправленный третьей стороне (на самом деле это микросервис), будет частью этого, верно? Или вы думаете, что я должен проверить их отдельно?

2. Вам определенно следует протестировать бизнес — логику вашего сервиса и взаимодействие вашего сервиса с API отдельно. Это разные типы тестов, модульный тест и интеграционный тест соответственно.