亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 時遇到問題。

考慮改用真正的枚舉?;旧希鷳撝荒M自己創建的過于復雜的對象(列表、迭代器和枚舉是不復雜對象的示例)。

此外,我無法覆蓋到 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 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號