Search code examples
springrestendpointgateway

Get mapping with multiple params as once


I have get mapping like this:

@GetMapping(value = "/topics", params = "dateRange")
public Set<Integer> getTopicsInRange(@RequestParam DateRange dateRange) {
    return topicService.getTopicsInRange(dateRange);
}

And now I would've like to test it as:

private final static DateRange VALID_DATE_RANGE = new DateRange(LocalDate.of(2018, 1, 1), LocalDate.of(2018, 2, 2));

@Test
public void gettingTopicsInRangeShouldReturn200(){
    given().
    .when()
    .get(String.format("/topics?dateRange=%s", VALID_DATE_RANGE)
    .then()
    .statusCode(200);
}

Expected status code <200> doesn't match actual status code <400>.

I know that my solution would've work if I would've change my DateRange param into 2 separated params as:

@GetMapping(value = "/topics", params = {"begin", "end"})
public Set<Integer> getTopicsInRange(@RequestParam Date begin, @RequestParam Date end) {
    return topicService.getTopicsInRange(begin, end);
}

and then test it as /topics?begin=value&end=value2 but it's not what I'm looking for (in case of DateRange would've like 10 fields making 10 params would've be really excessive I think) Any ideas how can I solve my problem?

EDIT This is my DateRange class:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class DateRange {
    LocalDate begin;
    LocalDate end;
}

Solution

  • Add DateTimeFormat annotation:

    public class DateRange {
    
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        private LocalDate begin;
    
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        private LocalDate end;
    
        // getter and setters
    }
    

    Receive object in controller:

    @GetMapping(value = "/topics")
    public Set<Integer> getTopicsInRange(DateRange dateRange) {
        return topicService.getTopicsInRange(dateRange);
    }
    

    And send params separately:

    @Test
    public void gettingTopicsInRangeShouldReturn200() {
        given()
        .queryParams("begin", LocalDate.of(2018, 1, 1).format(ISO_DATE),
            "end", LocalDate.of(2018, 2, 2))
        .when()
        .get("/topics")
        .then()
        .statusCode(200);
    }