为了账号安全,请及时绑定邮箱和手机立即绑定

Ldap 单元测试模拟 NamingEnumeration

Ldap 单元测试模拟 NamingEnumeration

喵喔喔 2023-04-26 14:48:29
我在尝试模拟 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);    }
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

我在尝试模拟 NamingEnumeration 时遇到问题。

考虑改用真正的枚举。基本上,您应该只模拟自己创建的过于复杂的对象(列表、迭代器和枚举是不复杂对象的示例)。

此外,我无法覆盖到 lambda 表达式内部。

它按预期工作。您模拟(读取替换)了搜索方法,因此没有对 lambda 表达式的求值,因为它已经具有定义的结果。

while 循环似乎认为 NamingEnumeration 是空的,因为没有覆盖。

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

hasMore 和 next 是您的拼写错误,因为您的示例中调用的方法是 hasMoreElements 和 nextElement。

@Test

public void addToList() throws NamingException {

   doReturn(true,false).when(enumeration).hasMoreElements();

   doReturn(attr).when(enumeration).nextElement();

   Assert.assertNotNull(ldapQueryDaoImpl.addToList(enumeration));

}

您可以单独验证 lambda 表达式,示例如下:


class MyMatcher implements AttributesMapper<Attributes> {


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


    public Attributes mapFromAttributes(Attributes attrs) {


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

        list.addAll(addToList(enumeration));

        return attrs;

    }

}

public void test() {


  NamingEnumeration<? extends Attribute> enumeration = ...


  Attribute attributeMock = mock(Attribute.class);

  when(attributeMock.getAll()).thenReturn(enumeration);


  Attributes attributesMock = mock(Attributes.class);

  when(attributesMock.get(any(String.class)).thenReturn(attributeMock);


  MyMatcher matcher = new MyMatcher();

  matcher.mapFromAttributes(attr);


  // assert ... matcher.list

}


查看完整回答
反对 回复 2023-04-26
  • 1 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信