如何在 Java 中模拟 LdapTemplate 并获得完整的代码覆盖率

How to Mock LdapTemplate in Java and get full code coverage

我正在尝试使用 Mockito 全面覆盖一个非常简单的 junit 测试,我正在罢工。我的免责声明是我是 Mockito 的新手,尽管我想做的事情看起来很简单。

注意我的junit测试通过了,只是覆盖的不完整。当测试为 运行 时,方法中 returns 为真(用户列表不为空)的部分未获取 run/covered.

我的问题是...

  1. ldap 是否需要准备任何测试数据?

  2. 你能简单地模拟 ldap 数据吗?

非常感谢您提供的任何见解。

这是正在测试的方法 (class name = LdapRepository)...

public Mono<Boolean> ldapTemplateQuery(Email email) {

        Mono<Boolean> blockingWrapper = Mono.fromCallable(() -> {
            List<LdapUser> users = ldapTemplate.find(query().where("cn").is(email.address()), LdapUser.class);
            if (users.isEmpty()) {
                return false;
            } else {
                return true;
            }
        }).onErrorResume(
                original -> Mono.error(new UserNotFoundException("User not found for email " + email.address())));
        return blockingWrapper.subscribeOn(Schedulers.elastic());
    } 

这是 junit class...

@RunWith(MockitoJUnitRunner.class)
public class LdapUserRepositoryMockTest {

    private @InjectMocks LdapUserRepository ldapUserRepository;

    @Mock
    private LdapTemplate ldapTemplate;

    Email email = new Email("abcd@xyz.com");
    User user = new User(email);

    static final String password = "VGVzdEAxMjM=";
    
    @Test
    public void ldapTemplateQueryTest() {

        LdapUser ldapUser = new LdapUser(user, password.toCharArray());
        List<LdapUser> users = new ArrayList<>();
        users.add(ldapUser);

        lenient().when(ldapTemplate.find(query().where(Mockito.anyString()).is(Mockito.anyString()), LdapUser.class)).thenReturn(users);
        
        Mono<Boolean> locked = ldapUserRepository.ldapTemplateQuery(email);
        StepVerifier.create(locked).expectNext(false).verifyComplete();
    }

这是覆盖结果的屏幕截图...

在某人的大力帮助下,我得到了答案。正如您将在下面看到的,这是对宽松声明的一个相当小的更改。

希望这对一路走来的人有所帮助。

@RunWith(MockitoJUnitRunner.class)
public class LdapUserRepositoryMockTest {

    private @InjectMocks LdapUserRepository ldapUserRepository;

    @Mock
    private LdapTemplate ldapTemplateMock;

    Email email = new Email("abcd@xyz.com");
    User user = new User(email);

    static final String PASSWORD = "VGVzdEAxMjM=";

    @Test
    public void ldapTemplateQueryTest() {

        LdapUser ldapUser = new LdapUser(user, PASSWORD.toCharArray());
        List<LdapUser> users = new ArrayList<>();
        users.add(ldapUser);
 
        lenient()
                .when(ldapTemplateMock.find(Mockito.any(), Mockito.eq(LdapUser.class)))
                .thenReturn(users);

        Mono<Boolean> locked = ldapUserRepository.checkIfAccountLocked(email);
        StepVerifier.create(locked).expectNext(true).verifyComplete();
    }
}