Spring runner test возвращает 404 для API-теста - PullRequest
1 голос
/ 04 июля 2019

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

RestController: package: com.x.y.address.controller (src/main)

@RestController
public class AddressInternalController {

    @PostMapping(value = "/v1/address-service/internal/company/address", produces = "application/json;charset=UTF-8")
    @ResponseStatus(OK)
    public @ResponseBody ResponseEntity<AddressModel> createCompanyAddress() 
            throws AddressException, BadRequestException {
        return ok("SUCCESS");
    }
}

Мой тестовый класс: package com.x.y.address.controller (src/test)

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = TestApp.class, initializers = ConfigFileApplicationContextInitializer.class)
@WebMvcTest(controllers = AddressInternalController.class, secure = false)
public class AddressInternalControllerTest {

    @Autowired
    private MockMvc mvc;

    @Before
    public void init() {}

    @Test
    public void createAddressTest_when_invalid_company() throws Exception {
        this.mvc.perform(post("/v1/address-service/internal/company/address").contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk());
    }
}

Мое приложение использует пружинную безопасность и для обходачто я создал класс TestAPP, чтобы он помог мне собрать только конфигурацию без безопасности.

TestApp: пакет com.xyaddress (src / test)

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class})
// @ComponentScan({"com.x.y.address.controller.AddressInternalController"})
public class TestApp {
}

Выше приведена структура класса.

Изначально я думал, что программа не сканируетпакет контроллера и, следовательно, 404. Следовательно, добавил компонент Scan.Но это не помогло.

Просматривал много стека по потоку, но большинство из 404 связано с типом, но это не в моем случае.

Журнал ошибок:

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /v1/address-service/internal/company/address
       Parameters = {}
          Headers = {Content-Type=[application/json]}
             Body = <no character encoding set>
    Session Attrs = {}

Handler:
             Type = org.springframework.web.servlet.resource.ResourceHttpRequestHandler

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

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

java.lang.AssertionError: Status 
Expected :200
Actual   :404

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 04 июля 2019

я заменил:

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class})
// @ComponentScan({"com.x.y.address.controller.AddressInternalController"})
public class TestApp {
}

с:

@SpringBootApplication(exclude = { SecurityAutoConfiguration.class})
// @ComponentScan({"com.x.y.address.controller.AddressInternalController"})
public class TestApp {
}

и это сработало.


ОБНОВЛЕНИЕ 1:

Я заметил, что в вашем @ComponentScan вы используете путь к самому классу, но вы должны указать на пакет с вашим контроллером. Если вы хотите указать класс, используйте basePackageClasses свойство @ComponentScan

...