当前位置: 首页 > 知识库问答 >
问题:

使用MockMvc和junit5测试LocalDate时的AssertionError

石正卿
2023-03-14

我试图在spring boot 2.3项目中使用JUnit5与Hibernate5.4和MockMvc。

这就是我的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;

我试图使用JUnit5用Mockito和MockMvc测试LocalDate字段birthDate。这就是测试用例的样子:

    @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>

正如您所看到的,这两个字符串表示形式是相同的。但是JUnit5会抛出错误。

那么,比较LocalDate和JUnit5的正确方法是什么呢?

在这里可以找到一个类似的问题:在Junit测试用例中使用Hamcrest比较LocalDate;在这里:测试SimpledateFormat时使用Junit AssertionError

提前道谢。:)

共有1个答案

林彬
2023-03-14

JsonPath对实际的JSON本身进行操作。此时,您的localdate已转换为JSONstring值。虽然有一个论点认为匹配器应该自动将Java值转换为字符串,但实际上并非如此,但如果您调用localdate.toString(),那么它应该可以工作。

(更一般地说,当您遇到匹配器错误,指出两个看起来相同的值不匹配时,可能是因为它们是不同的类型,具有公共的toString()格式。)

 类似资料:
  • 输出: @InjectMocks没有注入任何内容,因为authManagement为null,因此出现了NullPointerException。有谁能帮我解决这个问题吗。

  • 我试图使用spring和mockito对rest控制器进行单元测试。这是我的主控制器方法。 这是我的JUnit测试: 在输出响应中,测试失败,因为它得到404错误,但它预期成功代码为200。我相信我已经正确设置了独立配置,我会做错什么。为什么URI没有正确映射到方法?请注意,对于来自应用程序前端的相同URI,它工作正常。以下是我使用Postman工具为chrome测试的正确200响应的完整URI:

  • 我正在使用spock框架为Spring 3控制器类编写测试。我在尝试执行其中一个测试(GET请求)时收到以下错误。请注意,同一类中的所有其他测试(POST请求)都按预期工作。 控制器签名 斯波克试验 组织。springframework。网状物util。NestedServletException:请求处理失败;嵌套的异常是java。lang.IllegalArgumentException:参数

  • ObjectBean类 所以我的问题是:我如何使用Spring mockMVC测试这个方法?

  • 我试图用以下代码测试Spring MVC控制器的错误响应 但是测试失败,异常是:。 当我卷曲这个URL时,我得到以下信息: 有人能帮我理解我做错了什么吗?

  • 我试图测试我的一个控制器,它返回给我一个get方法上的对象列表,以填充我页面上的下拉列表。 我试图使用MockMvc和Hamcrest编写一个JUnit测试来测试相同的内容。 我想比较对象列表,并测试它是否失败。 这就是我获取模型属性的方式: 提前谢了。