Ошибка ввода-вывода при GET «Отказано в соединении» во время модульного тестирования пользовательской конечной точки Spring, которая достигает конечной точки сваггера по умолчанию в контроллере Spring - PullRequest
0 голосов
/ 31 марта 2020

У меня есть конечная точка, которая получается из зависимости gradle, скажем, ее /v3/doc

Мне нужно было выставить конечную точку, давайте ее назовем, /v1/info, которая ударит / v3 / do c внутренне , массажи, некоторые из данных, которые выходят, затем возвращают этот фрагмент данных тому, кто назвал / v1 / info

Я написал код для него (ниже я опускаю часть для массажа для простоты), но модульные тесты выдают ошибку, описанную во время выполнения теста.

Моя конечная точка выглядит так:

@RestController
public class MyController {

    @GetMapping("v1/info")
    public @ResponseBody SomePojo swag(HttpServletRequest request) {
        String s = retrieve(request
                                .getRequestURL()
                                .toString()
                                .split("v1")[0] // get the base URL and tack on what i need
                                .concat("v3/doc")
                        );

        return new Gson().fromJson(s, SomePojo.class)
    }

    private String retrieve(String url) {
        return new RestTemplate()
            .getForEntity(url, String.class)
            .getBody();
    }
}

модульный тест выглядит так:

@WebMvcTest(MyController.class)
@ActiveProfiles(profiles = "local")
public class MyControllerTest {

@Autowired
private MockMvc mockMvc;

@Test
public void testEndpoint() throws Exception {
    mockMvc.perform(get("/v1/info")
            .contentType(MediaType.APPLICATION_JSON)
            .characterEncoding("utf-8"))
            .andExpect(status().isOk());
}
}

ошибка выглядит так:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost/v3/doc": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)

Мне интересно, это как-то связано с портом ?? потому что когда я запускаю приложение на 8001, я могу нажать /v3/doc и /v1/info без проблем. Но, как вы можете видеть, когда запускаются модульные тесты, порта нет, только localhost. Я не думал, что это имело значение, хотя. Придется ли мне создавать какую-нибудь фальшивую заглушку mvc?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Ваш тестовый контекст создан только около @WebMvcTest(MyController.class). Это означает, что никакие другие конечные точки, а также сервер приложений также не работали в этом случае. И когда вы вызываете restTemplate, это не удается.

В случае, если вы хотите проверить, вы должны переместить создание RestTemplate вне метода и, например, сделать @Autowirible. После вы можете легко издеваться над ним в вашем тесте.

Или в случае, если сторонний сервис всегда доступен, вы получили ошибку, потому что порт не определен, но он выглядит концептуально некорректным для модульного теста.

0 голосов
/ 31 марта 2020

Вы можете попробовать не подключать Mock Mvc автоматически, а вместо этого создавать его в настройках, например:

@Autowired
private WebApplicationContext context;

@Before
public void setUp() {
  mockMvc = MockMvcBuilders
                .webAppContextSetup(context)
                .build();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...