猿问

Ldap 单元测试模拟 NamingEnumeration

我在尝试模拟 NamingEnumeration 时遇到问题。此外,我无法覆盖到 lambda 表达式内部。我也无法获得 while 循环内的覆盖范围。当我通过这些方法运行单元测试时,覆盖率仅通过 显示ldapTemplate.search,它会跳过 lambda 表达式内部的内容,并通过返回列表。我尝试将 Mock 注释添加到 NamingEnumeration 和 Attribute 对象。while 循环似乎认为 NamingEnumeration 是空的,因为没有覆盖。


以下结果导致“测试类中检测到不必要的存根”:doReturn(true,false).when(enumeration).hasMore();和doReturn(attr).when(enumeration).next();


这是我的 Ldap 方法


public List<MyObject> ldapQueryList(final String ldapSearch, final String key) {

        List<MyObject> list = new ArrayList<>();


        ldapTemplate.search("ou=User Accounts", "cn=" + ldapSearch), (Attributes attrs) -> {

                NamingEnumeration<?> enumeration = attrs.get(key).getAll();

                list.addAll(addToList(enumeration));

                return attrs;

        });


        return list;

    }

    public List<MyObject> addToList(NamingEnumeration<?> enumeration) throws NamingException {

        List<MyObject> list = new ArrayList<>();

        while (enumeration.hasMoreElements()) {

            final MyObject myObj = new MyObject();

            final String str = (String)enumeration.nextElement();

            myObj.setMyString(str);

            list.add(myObj);    

        }

        enumeration.close();

        return list;

    }

这是单元测试


@RunWith(MockitoJUnitRunner.class)

public class LdapQueryDaoTest {

    @Mock

    private LdapTemplate ldapTemplate;

    @InjectMocks

    private LdapDao ldapDao;

    @Mock 

    private NamingEnumeration<?> enumeration;

    @Mock 

    private Attribute attr;

    @Test

    public void ldapQueryList() throws DataAcesExcp, NamingException {

        List<String> searchResult = Collections.singletonList("search result");

        when(ldapTemplate.search( Mockito.anyString(), Mockito.anyString(), ArgumentMatchers.<AttributesMapper<String>> any())).thenReturn(searchResult);

        List<EmployeeVo> responseEntity = ldapDao.ldapQueryList(Const.EMPLOYEE_ID, "myLdapObj");

        Assert.assertNotNull(responseEntity);

    }



喵喔喔
浏览 96回答 1
1回答

慕桂英4014372

我在尝试模拟 NamingEnumeration 时遇到问题。考虑改用真正的枚举。基本上,您应该只模拟自己创建的过于复杂的对象(列表、迭代器和枚举是不复杂对象的示例)。此外,我无法覆盖到 lambda 表达式内部。它按预期工作。您模拟(读取替换)了搜索方法,因此没有对 lambda 表达式的求值,因为它已经具有定义的结果。while 循环似乎认为 NamingEnumeration 是空的,因为没有覆盖。以下结果导致“在测试类中检测到不必要的存根”:doReturn(true,false).when(enumeration).hasMore();&nbsp;和 doReturn(attr).when(enumeration).next();hasMore 和 next 是您的拼写错误,因为您的示例中调用的方法是 hasMoreElements 和 nextElement。@Testpublic void addToList() throws NamingException {&nbsp; &nbsp;doReturn(true,false).when(enumeration).hasMoreElements();&nbsp; &nbsp;doReturn(attr).when(enumeration).nextElement();&nbsp; &nbsp;Assert.assertNotNull(ldapQueryDaoImpl.addToList(enumeration));}您可以单独验证 lambda 表达式,示例如下:class MyMatcher implements AttributesMapper<Attributes> {&nbsp; &nbsp; List<MyObject> list = new ArrayList<>();&nbsp; &nbsp; public Attributes mapFromAttributes(Attributes attrs) {&nbsp; &nbsp; &nbsp; &nbsp; NamingEnumeration<?> enumeration = attrs.get(key).getAll();&nbsp; &nbsp; &nbsp; &nbsp; list.addAll(addToList(enumeration));&nbsp; &nbsp; &nbsp; &nbsp; return attrs;&nbsp; &nbsp; }}public void test() {&nbsp; NamingEnumeration<? extends Attribute> enumeration = ...&nbsp; Attribute attributeMock = mock(Attribute.class);&nbsp; when(attributeMock.getAll()).thenReturn(enumeration);&nbsp; Attributes attributesMock = mock(Attributes.class);&nbsp; when(attributesMock.get(any(String.class)).thenReturn(attributeMock);&nbsp; MyMatcher matcher = new MyMatcher();&nbsp; matcher.mapFromAttributes(attr);&nbsp; // assert ... matcher.list}
随时随地看视频慕课网APP

相关分类

Java
我要回答