AssertionError при тестировании LocalDate с Mock Mvc и JUnit 5 - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь использовать JUnit 5 с Hibernate 5.4 и Mock Mvc в проекте Spring Boot 2.3.

Вот как выглядят члены моего employee класса сущности:

import java.time.LocalDate;
... (Rest of the imports)

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long employeeId;

    @Column(nullable = false, updatable = true)
    private String firstName;

    @Column(nullable = true, updatable = true)
    private String lastName;

    @Column(nullable = false, updatable = true)
    private String email;

    @Column(nullable = false, updatable = true)
    private LocalDate birthDate;

Я пытаюсь проверить дату рождения поля LocalDate с помощью Mockito и Mock Mvc с помощью JUnit 5. Вот как выглядит тестовый пример для этого:

    @Test
    public void testFindEmployeeById() throws Exception {
        Employee mockedEmployee = makeEmployee(9L, "Mock First", "Mock Last", "mock@email.com",
                LocalDate.of(1996, 9, 8), 9L, "Mock Project", "Mock Department");

        Mockito.when(employeeRepositoryMock.findById(mockedEmployee.getEmployeeId()))
                .thenReturn(Optional.of(mockedEmployee));

        mockMvc.perform(MockMvcRequestBuilders.get("/v1/employees/id/9").accept(MediaType.APPLICATION_JSON))
                .andDo(MockMvcRestDocumentation.document("employeeById",
                        Preprocessors.preprocessRequest(Preprocessors.prettyPrint()),
                        PayloadDocumentation.responseFields(
                                PayloadDocumentation.fieldWithPath("employeeId").description("Employee ID"),
                                PayloadDocumentation.fieldWithPath("firstName").description("First Name"),
                                PayloadDocumentation.fieldWithPath("lastName").description("Last Name"),
                                PayloadDocumentation.fieldWithPath("email").description("Email Address"),
                                PayloadDocumentation.fieldWithPath("birthDate").description("Date of Birth"),
                                PayloadDocumentation.fieldWithPath("project.projectId").description("Project ID"),
                                PayloadDocumentation.fieldWithPath("project.name").description("Project name"),
                                PayloadDocumentation.fieldWithPath("project.department.departmentId")
                                        .description("Department ID"),
                                PayloadDocumentation.fieldWithPath("project.department.name")
                                        .description("Department Name"))))
                .andDo(print()).andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$.employeeId").value(mockedEmployee.getEmployeeId()))
                .andExpect(MockMvcResultMatchers.jsonPath("$.firstName").value(mockedEmployee.getFirstName()))
                .andExpect(MockMvcResultMatchers.jsonPath("$.lastName").value(mockedEmployee.getLastName()))
                .andExpect(MockMvcResultMatchers.jsonPath("$.email").value(mockedEmployee.getEmail()))
                .andExpect(MockMvcResultMatchers.jsonPath("$.birthDate").value(mockedEmployee.getBirthDate()))
                .andExpect(MockMvcResultMatchers.jsonPath("$.project.projectId")
                        .value(mockedEmployee.getProject().getProjectId()))
                .andExpect(
                        MockMvcResultMatchers.jsonPath("$.project.name").value(mockedEmployee.getProject().getName()))
                .andExpect(MockMvcResultMatchers.jsonPath("$.project.department.departmentId")
                        .value(mockedEmployee.getProject().getDepartment().getDepartmentId()))
                .andExpect(MockMvcResultMatchers.jsonPath("$.project.department.name")
                        .value(mockedEmployee.getProject().getDepartment().getName()));
    }

После запуска тестового примера , Я получаю AssertionError:

java.lang.AssertionError: JSON path "$.birthDate" expected:<1996-09-08> but was:<1996-09-08>

Как вы можете заметить, оба строковых представления одинаковы. Однако JUnit 5 выдает ошибку.

Итак, как правильно go сравнить LocalDate с JUnit 5?

Аналогичный вопрос можно найти здесь: Сравнение LocalDate используя Hamcrest в тестовом примере Junit и здесь: JUnit AssertionError при тестировании SimpledateFormat

Заранее спасибо. :)

1 Ответ

2 голосов
/ 02 августа 2020

JsonPath работает с самим JSON. К этому времени ваш LocalDate был преобразован в значение JSON string. Хотя есть аргумент, что средство сопоставления должно автоматически преобразовывать значения Java в строки, это не так, но если вы вызываете localDate.toString(), тогда он должен работать.

(В общем, каждый раз, когда вы получаете ошибка сопоставления, говорящая о том, что два значения, которые выглядят идентичны, не совпадают, вероятно, потому, что они разные типы, имеющие общий формат toString().)

...