Подтвердить что ты не робот

Изолированный контрольный тест не может создавать экземпляры Pageable

У меня есть MVC-контроллер Spring, который использует поддержку разбиения на страницы Spring -Data:

@Controller
public class ModelController {

    private static final int DEFAULT_PAGE_SIZE = 50;

    @RequestMapping(value = "/models", method = RequestMethod.GET)
    public Page<Model> showModels(@PageableDefault(size = DEFAULT_PAGE_SIZE) Pageable pageable, @RequestParam(
            required = false) String modelKey) {

//..
        return models;
    }

}

И я бы хотел протестировать RequestMapping с помощью хорошей тестовой поддержки MVC Spring. Чтобы эти тесты были быстрыми и изолированными от всех других вещей, я не хочу создавать полный ApplicationContext:

public class ModelControllerWebTest {
    private MockMvc mockMvc;

    @Before
    public void setup() {
        ModelController controller = new ModelController();
        mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
    }

    @Test
    public void reactsOnGetRequest() throws Exception {
        mockMvc.perform(get("/models")).andExpect(status().isOk());
    }

}

Этот подход отлично работает с другими контроллерами, которые не ожидают Pageable, но с этим я получаю один из этих хороших длинных Spring стеков. Он жалуется на невозможность создания экземпляра страницы:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.data.domain.Pageable]: Specified class is an interface
at   
.... lots more lines

Вопрос: Как мне изменить мой тест, чтобы преобразование макета без запроса-параметра-к-страницы было правильным?

Примечание. В реальном приложении все работает нормально.

4b9b3361

Ответ 1

Проблема со страницей может быть решена путем предоставления специального обработчика аргументов. Если этот параметр установлен, вы запускаетесь в Exception (loop) ViewResolver. Чтобы этого избежать, вам нужно установить ViewResolver (например, анонимный класс JSON ViewResolver).

mockMvc = MockMvcBuilders.standaloneSetup(controller)
            .setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver())
            .setViewResolvers(new ViewResolver() {
                @Override
                public View resolveViewName(String viewName, Locale locale) throws Exception {
                    return new MappingJackson2JsonView();
                }
            })
            .build();

Ответ 2

Просто добавьте @EnableSpringDataWebSupport для тестирования. Вот оно.