Как написать тест, чтобы контроллер мог подключаться к API? - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь разобраться с тестами Rest api. Ну, контроллер в моем коде подключается к внешнему анализу API и возвращает в виде JSON. Я пытаюсь запустить тест, чтобы он возвращал результат логики моего приложения. К сожалению, во время тестирования я не могу подключиться к api github.

java.lang.AssertionError: Status expected:<200> but was:<404>
Expected :200
Actual   :404
  @WebMvcTest(RepositoryDetailsController.class)
  @ContextConfiguration(classes = RepositoryDetailsController.class)

 class RepositoryDetailsControllerTestt {
    @Autowired
    private MockMvc mvc;


    @MockBean
    private RepositoryDetailsService service;
    @InjectMocks
    private RepositoryDetailsController repositoryDetailsController;


   @Before
    public void setUp() {

        mvc = MockMvcBuilders.standaloneSetup(repositoryDetailsController).build();
    }

    @Test
    public void mockTest() throws Exception {

        RepositoryDetailsResponse details = new RepositoryDetailsResponse();
        details.setDescription("Ruby toolkit for the GitHub API");
        details.set"https://github.com/octokit/octokit.rb.git");
        details.setStars("57892");
        details.setName("octokit/octokit.rb");

        mvc.perform(get("repository/{owner}/{repository}","octokit","octokit.rb")
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andDo(print())
                .andExpect(jsonPath("$.*", hasSize(5)))
                .andExpect(jsonPath("$.fullName").value(details.getName()))
                .andExpect(jsonPath("$.description").value(details.getDescription()))
                .andExpect(jsonPath("$.cloneUrl").value(details.getUrl()))
                .andExpect(jsonPath("$.stars").value(details.getStars()));
    }

1 Ответ

0 голосов
/ 01 ноября 2019

Если вы можете избежать этого, вы обычно не хотите подключаться к внешнему API в своих тестах. Наличие внешней тестовой зависимости API усложняет жизнь, например, что, если API не работает или что, если API претерпел критические изменения?

Существует несколько инструментов, которые можно использовать для насмешки над этим внешним API, жестко кодируя ожидаемые ответы. все еще делая запрос:

  • Wiremock - очень универсальный, предоставляет фиктивный сервер, который может использоваться с любой библиотекой, которая делает вызов API
  • Spring's MockRestServiceServer - особенно полезно, если ваш код использует RestTemplate для выполнения вызова API
  • Test Containers - если у вас есть изображение Docker, которое предоставляет фиктивный API

В вашем примере похоже, что вы пытались использовать MockMvc вместо MockRestServiceServer, но недостаточно кода, чтобы точно сказать, что вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...