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

问题描述

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

注意我的junit测试通过了,只是覆盖不完整。当测试运行时,返回 true(用户列表不为空)的方法部分没有被运行/覆盖。

我的问题是...

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

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

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

这里是正在测试的方法(类名= 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类...

@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();
    }

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

enter image description here

解决方法

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

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

@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();
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...