#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 отдельно. Это разные типы тестов, модульный тест и интеграционный тест соответственно.