繁体   English   中英

如何为这种类型的方法编写单元测试用例或模拟,或者我的自定义方法 removeUsers 对于单元测试来说不够好?

[英]How to write unit test cases or mock for this type of method or is my custom method removeUsers not good enough for unit tests?

我对 java 8 和单元测试完全陌生。 我很困惑我们如何为这个方法 RemoveUsers() 编写单元测试用例场景。 这是我的 class

@Slf4j
@Service
public class LdapService {
    private final UserRepository userRepository;
    private final MessageResolver messageResolver;

    @Autowired
    public LdapService(UserRepository userRepository, MessageResolver messageResolver) {
        this.userRepository = userRepository;
        this.messageResolver = messageResolver;
    }

      public void removeUsers(List<PersonDTO> ldapUsers) {

    List<User> pmUsers = ldapUsers.stream()
            .filter(personDTO -> userRepository.getUserByUserId(personDTO.getUserId()).isPresent())
            .map(PersonDTO::getUserId)
            .map(userRepository::getUserByUserId)
            .map(Optional::get)
            .collect(Collectors.toList());

    List<String> idsToBeDeleted = pmUsers.stream().map(User::get_id).collect(Collectors.toList());

    idsToBeDeleted.forEach(id -> {
        try {
            userRepository.deleteUser(id);
        } catch (DbApiException | RestApiException | IOException e) {
            log.error(messageResolver.message(MessageKeyEnum.ERROR_WHILE_DELETING_DATA));
        }
    });
}

}

我试图在下面做,但我无法弄清楚如何做,我确信下面的单元测试我写的内容需要修改。 有人可以帮我吗?

@ExtendWith(MockitoExtension.class) class 测试 {

@InjectMocks
private LdapService ldapService;

@Mock
private UserRepository userRepository;

@Test
void expectSuccesOnRemoveUsers() throws IOException {
    List<PersonDTO> personDTOList = Arrays.asList(
            PersonDTO.builder().dn("CN=abk_tch,OU=Users,OU=Bangalore,DC=apac,DC=dell,DC=com").userId("admin").build());
    String userId = "admin";
    UserUpdate userMock = UserUpdateMock.mockLdapUserWithDefaultValues().build();
    when(userRepository.getUserByUserId(userId)).thenReturn(Optional.of(userMock));
    ldapUserService.removeUsers(personDTOList);
    verify(userRepository,times(1)).deleteUser(userId);
}

}

下面提到一些object结构

getUserByUserId(id) 返回可选用户

deleteUser(id) 是接收 id 的无效方法

personDto 如下

公共 class PersonDTO {

private String userId;
private String firstName;
private String lastName;
private String email;
private String dn;

}

Stream API 的使用很糟糕。 以下代码:

    List<User> pmUsers = ldapUsers.stream()
            .filter(personDTO -> userRepository.getUserByUserId(personDTO.getUserId()).isPresent())
            .map(PersonDTO::getUserId)
            .map(userRepository::getUserByUserId)
            .map(Optional::get)
            .collect(Collectors.toList());

    List<String> idsToBeDeleted = pmUsers.stream().map(User::get_id).collect(Collectors.toList());

可以替换为:

List<String> idsToBeDeleted = ldapUsers.stream()
        .map(PersonDTO::getUserId)
        .map(userRepository::getUserByUserId)
        .flatMap(Optional::stream)
        .map(User::get_id)
        .collect(Collectors.toList());

但是,这无济于事,因为您的案例实际上是在演示尝试编写单元测试时发现损坏的 API 的情况。 基本上,方法#removeUsers而不是void必须返回有关哪些用户已被删除以及哪些用户没有被删除以及原因的信息,在重构#removeUsers之后,您将能够传递任何输入并检查output。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM