Модульный тест для HttpGraphQlClient при весенней загрузке 3 и Java 17 с Mockito и Junit?

привет, я использую 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.


138
1

Ответ:

Решено

Для модульного теста мы можем имитировать все взаимодействия с другими частями. Начнем с издевательства над 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 обычно используется в интеграционных тестах. Учитывая, что интеграционные тесты выходят за рамки этого ответа