簡體   English   中英

Ldap單元測試模擬命名枚舉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM