Как написать тест JUnit с жестко закодированным объектом, обладающим LocalDate - PullRequest
0 голосов
/ 15 декабря 2018

Когда я пытаюсь протестировать мой Api-контроллер с жестко запрограммированным объектом, все нормально, я пытаюсь добавить параметр LocalDate в объект.

Мой тест:

@RunWith(SpringRunner.class)
@WebMvcTest(ApiTransitController.class)
public class ApiTransitControllerTest {


    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private TestService testService;

    @MockBean
    private ReportsService reportsService;

    @MockBean
    private TransitService transitService;

    @Test
    public void shouldCreateTransit() throws Exception {

        Transit transit = new Transit("London", "Paris", 12L, 
    LocalDate.of(2018,10,12));

        ObjectMapper objectMapper = new ObjectMapper();
        String transitJsonString = objectMapper.writeValueAsString(transit);


        this.mockMvc.perform(post("/api/transit")
                .contentType(MediaType.APPLICATION_JSON)
                .content(transitJsonString))
                .andExpect(status().isCreated());

        verify(transitService).addTransit(eq(new Transit("London", "Paris", 12L, 
   LocalDate.of(2018,10,12))));
    }
}

Модель:

@ Открытый класс объекта Entity {

@Column(name = "id")
@Id
@GeneratedValue
private Long id;
private String sourceAdress;
private String destinationAdress;
private Long price;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private LocalDate date;
@JsonSerialize(using=DistanceSerializer.class)
private Long distance;

 public Transit(String sourceAdress, String destinationAdress, Long price, LocalDate date) {
        this.sourceAdress = sourceAdress;
        this.destinationAdress = destinationAdress;
        this.price = price;
        this.date = date;
    }

//getters and setters, equals and hashCode and toString

Контроллер API:

 @PostMapping("/api/transit")
    @ResponseStatus(HttpStatus.CREATED)
    public void createTransit(@RequestBody Transit transit){
        LOG.info("Saving transit={}", transit);
        transitService.addTransit(transit);
    }

Я попытался добавить DateTimeFormmater и несколько других способов, но все равно не могу пройти тест.Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Я добавил JsonSerializer к дате выпуска модели:

Модель:

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
@JsonSerialize(using=DateSerializerNumberTwo.class)
    private LocalDate date;

Сериализатор:

public class DateSerializerNumberTwo extends StdSerializer<LocalDate> {


    private static DateTimeFormatter formatter =
            DateTimeFormatter.ofPattern("yyyy-MM-dd");

    public DateSerializerNumberTwo(){
        this(null);
    }
    protected DateSerializerNumberTwo(Class<LocalDate> t){
        super(t);
    }

    @Override
    public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeString(formatter.format(value));
    }
}

И тест проходит без каких-либо изменений в тестекод.Я думаю, это потому, что ответ даты по умолчанию в формате Json "yyyy, mm, dd", а не как Local date (yyyy-mm-dd) ".

0 голосов
/ 15 декабря 2018

Попробуйте изменить эту строку

verify(transitService).addTransit(eq(new Transit("London", "Paris", 12L, 
   LocalDate.of(2018,10,12))));

на эту:

verify(transitService).addTransit(eq(transit));

Два объекта не равны, также вам не нужно создавать новый объект, который вы можете использоватьуже создан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...