我如何必须用 mockito 测试这种方法



服务类中的方法:

@Override
@Transactional(readOnly = true)
public Collection<Account> searchAccounts(String partOfName) {
    Collection<Account> accounts = accountDao.getAll();
    CollectionUtils.filter(accounts, account ->
            account.getName().toLowerCase().contains(partOfName.toLowerCase()) ||
                    account.getSurname().toLowerCase().equalsIgnoreCase(partOfName.toLowerCase()));
    return accounts;
}

我不明白我必须用CollectionUtils.filter做什么。 也嘲笑这个?现在我在测试类中有这个:

@Test
public void searchAccountsByPartOfName() {
    service.searchAccounts("test");
    verify(accountDao, times(1)).getAll();
}

CollectionUtils.filter是一种基于谓词筛选集合的实用工具方法。你不需要嘲笑它。

你需要做的是模拟accountDao返回一个Collection<Account>。集合中的帐户实例可以是真实对象或模拟对象。如果是一个简单的POJO,我建议创建一个真实账户对象列表。

然后,验证从列表中返回的Collection<Account>,因为它是否根据谓词正确筛选出 Account 对象。

有了这个,你正在测试你的代码/逻辑的关键。

它可能看起来像这样(免责声明:未编译(

@Test
public void searchAccountsByPartOfName() throws ParseException {
    Collection<Account> accounts = new ArrayList<>();
    Account acc1 = new new Account(..); //name having the substring "test"
    Account acc2 = new new Account(..); //surname equals "test"
    Account acc3 = new new Account(..);  //neither name nor surname has the substring "test"
    accounts.add(acc1); 
    accounts.add(acc2); 
    accounts.add(acc3);
    when(accountDao.getAll()).thenReturn(accounts);
    service.searchAccounts("test");
    Collection<Account> actual = service.searchAccounts("test");
    //here assert that the actual is of size 2 and it has the ones that pass the predicate
    assertEquals(2, actual.size());
    assertEquals(acc1, actual.get(0));
    assertEquals(acc2, actual.get(1));
}

您可能还希望编写类似的测试来测试不敏感案例检查。

CollectionUtils.filter()调用包含由 searchAccounts() 方法执行的逻辑,而Collection<Account> accounts = accountDao.getAll();是要隔离的searchAccounts()的一部分,由另一个依赖项执行。
因此,模拟accountDao()返回特定的帐户列表,并断言searchAccounts()返回预期的筛选帐户。

相关内容

  • 没有找到相关文章

最新更新