Ldap单元测试模拟命名枚举

我家 :

我在尝试模拟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);
    }
    @Test
    public void addToList() throws NamingException {
        doReturn(true,false).when(enumeration).hasMore();
        doReturn(attr).when(enumeration).next();
        Assert.assertNotNull(ldapQueryDaoImpl.addToList(enumeration));
    }
}
第二:

我在尝试模拟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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章