微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当模拟返回无序集合 Map 时,如何测试 API 行为?

如何解决当模拟返回无序集合 Map 时,如何测试 API 行为?

我有一个 API,API 调用返回 Map<String,List<String>> 的服务,API 将其转换为 List 并返回。

public List<EmployeeWrapper> getEmployees(int id) {
    Map<Integer,List<String>> employees = employeeRepository.getEmployees(id);
    return employees.entrySet().stream()
            .map(entry -> new EmployeeWrapper(entry.getKey(),entry.getValue()))
            .collect(Collectors.toList());
}

现在,我需要编写一个测试用例来涵盖此行为,但这里的问题是 Mock 返回 HashMap,并且每次调用List<EmployeeWrapper> 的顺序可能不同。

@Test
void testemployeeService() {
    // when
    EmployeeRepository employeeRepository = Mockito.mock(EmployeeRepository.class);
 
    Map<Integer,List<String>> employeeIdsToEmployee = 
            Map.of(1,List.of("HR","Account"),2,List.of("Marketing"));
    Mockito.when(employeeRepository.getEmployees(Mockito.any())).thenReturn(employeeIdsToEmployee);
    
    // call service
    List<EmployeeWrapper> employees = employeeService.getEmployees(10);
    
    // assert
    assertthat(employees).isNotNull().hasSize(2);
    EmployeeWrapper employeeWrapper1 = employees.get(0);
    EmployeeWrapper employeeWrapper2 = employees.get(1);

    assertthat(employeeWrapper1).isNotNull().extracting("id","departments")
            .containsExactly(1,"Account"));
    assertthat(employeeWrapper2).isNotNull().extracting("id","departments")
            .containsExactly(2,List.of("Marketing"));
}

这里的问题是 employees.get(0)employees.get(1) 并不总是与使用无序集合构建的员工列表相同的对象。

是否有更好的方法来测试 API 的行为是否依赖于无序集合?

解决方法

AssertJ 的可迭代断言有一个 'containsExactlyInAnyOrder' 方法。

你必须在列表上开始断言:

assertThat(employees)
         .extracting("id","departments")
         .containsExactlyInAnyOrder(
            tuple(1,List.of("HR","Account")),tuple(2,List.of("Marketing")));

顺便说一句,提取方法也支持 lambda 的,所以它可以是:

assertThat(employees)
         .extracting(
              EmployeeWrapper::getId,EmployeeWrapper::getDepartments)
         .containsExactlyInAnyOrder(
              tuple(1,List.of("Marketing")));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。