Springboot test, как разрешить параметр контроллера для объекта - PullRequest
1 голос
/ 18 апреля 2019

У меня есть подпись метода, подобная этой, в контроллере. когда я пытаюсь написать модульный тест для него. он возвращает 500 вместо 404. похоже, он не может преобразовать {id} в необязательный Есть ли какие-либо настройки, которые мне нужно сделать, чтобы он мог автоматически преобразовать параметр в объект?

Спасибо

@RequestMapping("/propagationStores")
public class PropagationStoreController {


    private StoreRepository storeRepository;
    private CustomValidator validator;
    public PropagationStoreController(StoreRepository storeRepository) {
        this.storeRepository = storeRepository;

    }

    @GetMapping(value = "/{id}")
    public Resource<StoreDto> getById(@PathVariable("id") Optional<Store> storeOptional) {

        return storeOptional
            .map(StoreConverter::toDto)
            .map(store -> {
                Resource<StoreDto> resource = new Resource<>(store);
                resource.add(new Link("http://localhost").withTitle("localhost"));
                return resource;
        }).orElseThrow(ResourceNotFoundException::new);
    }

когда я пытаюсь проверить метод getById, используя следующий код. Я получаю 500 вместо 400

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class PropagationStoreControllerIT {


    @MockBean
    StoreRepository storeRepository;
    @MockBean
    CustomValidator customValidator;


    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testGetById() throws Exception {
        when(storeRepository.findById(1l)).thenReturn(Optional.empty());
        mockMvc.perform(get("/propagationStores/1")).andDo(print()).andExpect(status().is4xxClientError());
    }
}

Я ожидал статус 404, но получаю 500.

журнал как следующий.

   MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /propagationStores/1
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = local.tux.propagation.controller.PropagationStoreController
           Method = public org.springframework.hateoas.Resource<local.tux.propagation.dto.Store$StoreDto> local.tux.propagation.controller.PropagationStoreController.getById(java.util.Optional<local.tux.propagation.evaluator.domain.Store>)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException

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

FlashMap:
       Attributes = null

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

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /propagationStores/1
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = local.tux.propagation.controller.PropagationStoreController
           Method = public org.springframework.hateoas.Resource<local.tux.propagation.dto.Store$StoreDto> local.tux.propagation.controller.PropagationStoreController.getById(java.util.Optional<local.tux.propagation.evaluator.domain.Store>)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException

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

FlashMap:
       Attributes = null

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

java.lang.AssertionError: Range for response status value 500 
Expected :CLIENT_ERROR
Actual   :SERVER_ERROR

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Определите ваш метод контроллера следующим образом:

public Resource<StoreDto> getById(@PathVariable("id") Optional<String> id) {
    ......
}

id можно преобразовать в строку или число, а не в класс Store.

0 голосов
/ 23 апреля 2019

Мне удалось решить проблему с помощью добавления @TestConfiguration. Это выглядит как @MockBean прерывает нормальную инициализацию пружинной загрузки, конвертер не регистрируется. Чтобы это работало, нам нужно зарегистрироваться.

 @TestConfiguration
    static class InternalConfig {
        @Bean
        WebMvcConfigurer configurer() {
            return new WebMvcConfigurer() {

                @Override
                public void addFormatters(FormatterRegistry registry) {
                    registry.addConverter(String.class, Store.class, id -> staticRepository.getOne(Long.parseLong(id)));
                }
            };
        }
    }
...