Spring Controller Test: Почтальон против JUnit - Запрос ошибки в поле отклонен [null] - PullRequest
0 голосов
/ 28 марта 2020

Я новичок в Spring Framework, пытаюсь протестировать контроллер.

Самое смешное, что с помощью Postman я получил правильный ответ, но не в JUnit, где получают Actual :400 (неверный запрос ) вместо Expected :200.

enter image description here

enter image description here

Это связано с пустым полем passengerCount потому что кажется нулевым. Класс запроса отличается от ответа. Последний не имеет поля для пассажира.

Контроллер

    @Validated
    @RestController
    @RequestMapping("flights")
    public class BusyFlightsController {


        CrazyAirDatabase crazyAirService;

        @Autowired
        public BusyFlightsController(CrazyAirDatabase crazyAirService) {
            this.crazyAirService = new CrazyAirDatabase();
        }

        @RequestMapping(value = "/crazy-air-response", method = RequestMethod.GET, produces = "application/json")
        public List<CrazyAirResponse> getCrazyAirResponse(
                @Valid CrazyAirRequest crazyAirRequest,
                @RequestParam("origin") String origin,
                @RequestParam("destination") String destination,
                @RequestParam("departureDate") String departureDate,
                @RequestParam("returnDate") String returnDate,
                @RequestParam("passengerCount") int passengerCount
        ) {
            crazyAirRequest = new CrazyAirRequest(origin, destination, departureDate, returnDate,
                    passengerCount);
            return crazyAirService.getCrazyAirResponse(crazyAirRequest);
        }
}

CrazyAirRequest класс

    public class CrazyAirRequest {

        @IATACodeConstraint
        private String origin;
        @IATACodeConstraint
        private String destination;
        private String departureDate;
        private String returnDate;
        private int passengerCount;


        public CrazyAirRequest(String origin, String destination, String departureDate,
                               String returnDate, int passengerCount) {
            this.origin = origin;
            this.destination = destination;
            this.departureDate = departureDate;
            this.returnDate = returnDate;
            this.passengerCount = passengerCount;
        }
    // Getters
}

CrazyAirResponse класс

public class CrazyAirResponse {

    private String airline;
    private double price;
    private String cabinClass;
    private String departureAirportCode;
    private String destinationAirportCode;
    private String departureDate;
    private String arrivalDate;


    public CrazyAirResponse(String airline, double price, String cabinClass, String departureAirportCode,
                            String destinationAirportCode, String departureDate, String arrivalDate) {
        this.airline = airline;
        this.price = price;
        this.cabinClass = cabinClass;
        this.departureAirportCode = departureAirportCode;
        this.destinationAirportCode = destinationAirportCode;
        this.departureDate = departureDate;
        this.arrivalDate = arrivalDate;
    }
// Getters
}

Репо CrazyAirDatabase

@Component
public class CrazyAirDatabase implements CrazyAirService {

    List<CrazyAirResponse> list;

    public CrazyAirDatabase() {
        list = new ArrayList<>(
                Arrays.asList(
                        new CrazyAirResponse("Ryanair", 125, "E", "LHR",
                                "BRN", "2018-10-08", "2020-10-08")             
        );
    }

    @Override
    public List<CrazyAirResponse> getCrazyAirResponse(CrazyAirRequest request) {

        return list.stream()
                .filter(t -> t.getDepartureAirportCode().equals(request.getOrigin()) &&
                        t.getDestinationAirportCode().equals(request.getDestination()) &&
                        t.getDepartureDate().equals(request.getDepartureDate()) &&
                        t.getArrivalDate().equals(request.getReturnDate())
                )
                .collect(Collectors.toList());
    }
}

Тест

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

    @Autowired
    MockMvc mockMvc;

    @Mock
    CrazyAirRequest crazyAirRequest;

    @InjectMocks
    private BusyFlightsController controller;

    @Mock
    CrazyAirService service;

    @Before
    public void before() {
        MockitoAnnotations.initMocks(this);
        this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
    }


    @Test
    public void testino() throws Exception {

        crazyAirRequest = new CrazyAirRequest("LHR",
                "BRN", "2018-10-08", "2020-10-08", 120);

        List<CrazyAirResponse> crazyAirResponse = Arrays.asList(new CrazyAirResponse("Ryanair", 125,
                        "E", "LHR",
                        "BRN", "2018-10-08", "2020-10-08")

        );

        when(service.getCrazyAirResponse(crazyAirRequest)).thenReturn(crazyAirResponse);

        ObjectMapper objectMapper = new ObjectMapper();
        String airplane = objectMapper.writeValueAsString(crazyAirResponse);

        ResultActions result = mockMvc.perform(get("/flights/crazy-air-response")
                .contentType(MediaType.APPLICATION_JSON)
                .content(airplane)
        );

        result.andExpect(status().isOk());

    }
}

1 Ответ

0 голосов
/ 28 марта 2020

Если я поставлю это:

 ResultActions result = mockMvc.perform(get("/flights/crazy-air-response?origin=LHR&destination=CTA&departureDate=some&returnDate=some&passengerCount=1")
            .contentType(MediaType.APPLICATION_JSON)
            .content(airplane)
    );

Тест пройден.

Затем, нужно ли сначала выполнить Почтальон, а затем скопировать и вставить запрос для прохождения теста?

...