我在尝试模拟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(枚举).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
}