привет, я использую HttpGraphQlClient из пакета Spring-boot-starter-graphql в Spring Boot 3 с Java 17. Теперь я застрял в написании примеров модульного тестирования для этого метода.
Учитывая, что у меня есть правильная конфигурация для зависимости, и API работает при вызове метода.
*У меня на службе-*
public void callApi(){
var response = httpGraphQlClient.document("test").retrieve("pokemon").toEntity(List.class).block();
}
Я пробовал использовать RestAssured, но, похоже, это не работает.
🤔 А знаете ли вы, что...
Java была разработана компанией Sun Microsystems в 1991 году и первоначально называлась Oak.
Для модульного теста мы можем имитировать все взаимодействия с другими частями. Начнем с издевательства над HttpGraphQlClient. Сначала нам следует подумать, как мы будем использовать наш макет. Для этого мы можем внедрить его в эксплуатацию. Наш сервис может быть
@Service
public class PockemonService {
// injected variable defined in constructor
private HttpGraphQlClient httpGraphQlClient;
@Autowired
public PockemonService(HttpGraphQlClient httpGraphQlClient) {
this.httpGraphQlClient = httpGraphQlClient;
}
public List<String> callApi() {
return httpGraphQlClient // we shall mock it in unit test
.document("test") // returns RequestSpec, mock it too
.retrieve("pockemon") // returns RetrievSpec, also mock it
.toEntity(List.class)
.block();
}
}
Теперь мы можем протестировать наш API, начиная с издевательства над HttpGraphQlClient и издевательства над всеми его методами, используемыми в API.
public class PockemonServiceTest {
@Test
void callApi() {
// expected result
List<String> expected = List.of("pockemon1", "pockemon2");
// mock RequestSpec
GraphQlClient.RequestSpec requestSpec = Mockito.mock(GraphQlClient.RequestSpec.class);
// mock RetriveSpec
GraphQlClient.RetrieveSpec retrieveSpec = Mockito.mock(GraphQlClient.RetrieveSpec.class);
// mock HttpGraphQlClient
HttpGraphQlClient httpGraphQlClient = Mockito.mock(HttpGraphQlClient.class);
// define mock results
doReturn(requestSpec).when(httpGraphQlClient).documentName(anyString());
doReturn(retrieveSpec).when(requestSpec).retrieve(anyString());
doReturn(Mono.just(expected)).when(retrieveSpec).toEntity(List.class);
// inject mocked httpGraphQlClient into service
PockemonService pockemonService = new PockemonService(httpGraphQlClient);
// execute service method
List<String> actual = pockemonService.callApi();
// verify result
assertEquals(expected, actual);
}
}
RestAssure обычно используется в интеграционных тестах. Учитывая, что интеграционные тесты выходят за рамки этого ответа