![](/img/trans.png)
[英]Junit Test for testing data in NamingEnumeration in LDAP connectivity test
[英]Ldap Unit Test Mock 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);
}
@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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.