Ошибка весеннего тестирования загрузки: java.lang.IllegalArgumentException: страница не должна быть нулевой - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь проверить следующий контроллер:

@RepositoryRestController
@RequestMapping("movies")
public class MovieController {

    private MovieService movieService;
    private PagedResourcesAssembler<Movie> pagedAssembler;
    private MovieResourceAssembler movieResourceAssembler;

    @Autowired
    public void setMovieService(MovieService movieService) {
        this.movieService = movieService;
    }

    @Autowired
    public void setPagedAssembler(PagedResourcesAssembler<Movie> pagedAssembler) {
        this.pagedAssembler = pagedAssembler;
    }

    @Autowired
    public void setMovieResourceAssembler(MovieResourceAssembler movieResourceAssembler) {
        this.movieResourceAssembler = movieResourceAssembler;
    }

    // Return all movies with pagination
    @GetMapping
    public ResponseEntity<?> getAllMovies(Pageable pageable) {
        Page<Movie> moviePage = this.movieService.getAllMovies(pageable);
        // Remove some unnecessary fields
        //this.movieService.removeUndesirableFieldsFromListing(moviePage);
        return ResponseEntity.ok(this.pagedAssembler.toResource(moviePage, this.movieResourceAssembler));
    }
 }

и вот тест:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MovieControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private MovieService movieService;

    @Test
    public void getAllMovies_PageableGiven_ShouldReturnMoviesPage() throws Exception {
        List<Movie> movieList = new ArrayList<>();
        movieList.add(new Movie());
        movieList.add(new Movie());
        Page<Movie> moviePage = new PageImpl<>(movieList);
        given(this.movieService.getAllMovies(PageRequest.of(0,2)))
                .willReturn(moviePage);
        this.mockMvc.perform(get("http://localhost:8080/api/movies?page=1"))
                .andExpect(status().isOk());
    }
}

я получил следующую ошибку:

org.springframework.web.util.NestedServletException: обработка запроса не удалась; Вложенное исключение - java.lang.IllegalArgumentException: страница не должна быть нулевой!

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы можете использовать объект mockMvc Spring, внедряя его в ваш тестовый класс:

 @Autowired
 private MockMvc mockMvc;

Я только что создал тестовый метод, используя метод mockMvc.perform, отправляющий запрос страницы:

Код моего контроллера:

@GetMapping(produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
public List<BaseResponse> listAllBase(
        @PageableDefault(size = 50, page = 2) Pageable pageable) {

    // logger.debug("paginación recibida :{}",pageable);
    List<BaseResponse> findAllBases = baseService.findAllBases();
    return findAllBases;

}

Мой тестовый код:

mockMvc.perform(get("/base/?size=2&page=0")).andExpect(status().isOk())
             .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))                        .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
             .andExpect(jsonPath("$", hasSize(2)))                       .andExpect(jsonPath("$", hasSize(2)))
             .andExpect(jsonPath("$[0].name", equalToIgnoringCase("margarita")))

Смотрите полный код класса в моем репозитории GitHub:

Контроллер:

https://github.com/cristianprofile/spring-boot-mvc-complete-example/blob/develop/spring-boot-mvc-rest/src/main/java/com/mylab/cromero/controller/HelloWorldController.java#L53

Метод тестового класса:

https://github.com/cristianprofile/spring-boot-mvc-complete-example/blob/develop/spring-boot-mvc-rest/src/test/java/com/mylab/cromero/controller/RestTestIT.java#L66

Не стесняйтесь использовать его в своем проекте:)

0 голосов
/ 05 сентября 2018

Читая эти два потока Stackoverflow ( [1] и [2] ), а также Spring-документацию , кажется, что вам следует использовать Page с репозиториями , Пример:

PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(new PageRequest(1, 20));

В вашем случае рекомендуется использовать PagedListHolder. Пример:

List<Movie> movieList = new ArrayList<>();
movieList.add(new Movie());
movieList.add(new Movie());
PagedListHolder<Movie> holder = new PagedListHolder<>(movieList);
...