Почему тест контроллера Spring Boot возвращает 404, а контроллер обнаружен в контексте? - PullRequest
1 голос
/ 21 апреля 2020

У меня есть REST-контроллер, который я пытаюсь протестировать, но при попытке POST к нему я получаю 404. Тест - JUnit 5 и Spring Boot 2.1.5. Если я запускаю приложение, я могу нажать на контроллер через Почтальон. Я запустил его в режиме отладки и убедился, что myController не равен нулю и в него вставлены проверенные сервисы. Что мне здесь не хватает? spring-boot-starter-test является зависимостью, а junit4 является исключением.

@RestController
@Slf4j
@RequestMapping(path = /integrations,
    produces = "application/json")
public class MyController {

    private MyService myService;
    private MyValidationService myValidationService;

    public MyController(MySerivce service, MyValidationService myValidationService) {
        this.myService = service;
        this.myValidationService = myValidationService;
    }

    @PostMapping(path = "/users", produces = "application/json", consumes = 
                                       "application/json")
    public ResponseEntity<User> getUserList(@Valid @RequestBody final RequestPayload 
          requestPayload, @RequestHeader Map<String, String> headers) throws MyException {
        // check the credentials and permission
        Map<String, String> credInfo = myValidationService.validateHeaders(headers);

        // process payload
        return myService.retrieveUsers(requestPayload);


    }
}

Тест выглядит следующим образом:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ExtendWith(SpringExtension.class)
@AutoConfigureMockMvc
class MyControllerTest {

    @MockBean
    private MyService myService;

    @MockBean
    private MyValidationService myValidationService;

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    MyController myController;

    @Test
    public void contextLoads() throws Exception {
        Assert.assertNotNull(myController);
    }

    @Test
    void getUserList() throws Exception {
        List<User> users = returnUserList();
        HttpEntity<RequestPayload> requestHttpEntity = new HttpEntity<>(returnPayload(), null);
        when(myService.retrieveUsers(any(RequestPayload.class))).thenReturn(users);
        mockMvc.perform(post("/integrations/users")
                .contentType(MediaType.APPLICATION_JSON)
                .content(asJsonString(returnPayload()))
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().is2xxSuccessful());

    }
}

Ответ, который я получаю:

MockHttpServletResponse:
           Status = 404
    Error message = null
          Headers = []
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

Ответы [ 2 ]

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

Я ценю ответы, но я обнаружил, в чем проблема - и это была тупица!

Оказывается, я включил контекстный путь в вызов mock Mvc, когда это значение уже предоставляется в файле application.properties ! Таким образом, вместо URI / интеграций / пользователей реальный используемый URI был / интеграций / интеграций / пользователей , что неудивительно, что не существует!

Благодаря все и извините за то, что не взял мои глаза в свои руки и не посмотрел поближе.

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

Вместо этого вы можете использовать аннотацию теста среза. Для тестирования контроллера вы можете использовать @ WebMvcTest.

Ваша установка будет выглядеть следующим образом:

@SpringBootTest(value = MyController.class)
@ExtendWith(SpringExtension.class)
class MyControllerTest { 

Вы все еще можете @Autowired the Mock Mvc. Также нет необходимости автоматически подключать ваш контроллер в тесте.

...