【问题标题】:Why Does My Apex Map Appear To Get Overwritten?为什么我的 Apex 地图似乎被覆盖?
【发布时间】:2021-10-01 23:09:20
【问题描述】:

我正在尝试构建一个测试数据工厂来创建多个联系人并将它们附加到一个帐户。该方法应将帐户 ID 映射到联系人列表。但是,我的测试类失败了,我可以从调试日志中看到所有联系人都与一个帐户相关。我已将调试语句放在适当的位置,以便我可以看到在循环内构建的地图,它看起来还不错。然后,当我在循环外立即查看地图时,它包含同一联系人的 4 个副本。这是我的代码,后面是调试语句。我通过使用 2 个帐户和一个联系人来保持简单。如果有人可以提供帮助,我真的很想了解这里出了什么问题。

public static Map<Id, List<Contact>> createContacts(List<Account> accounts, Integer numOfContacts) {

Map<Id, List<Contact>> mapOfAccountIdToListOfContacts = New Map<Id, List<Contact>>();
List<Contact> addedContacts = New List<Contact>();
List<Contact> accContacts = New List<Contact>();

    for(Account ac :accounts) {
        accContacts.clear();
        for(Integer i=0;i<numOfContacts;i++) {
            Contact newContact = New Contact(LastName='TestContact' + i,
                                          Email = 'TestContact' + i + '@testco.com',
                                            AccountId = ac.Id);
            accContacts.add(newContact);
        }
        mapOfAccountIdToListOfContacts.put(ac.Id, accContacts);
        System.debug('Map.put=' + ac.id + ', ' + accContacts);
        addedContacts.addAll(accContacts);
    }
    insert addedContacts;
    for(Id key :mapOfAccountIdToListOfContacts.keyset()) {
        System.debug('Contacts=' + mapOfAccountIdToListOfContacts.get(key));
    }
    return mapOfAccountIdToListOfContacts;
}

和日志输出:

It said the log was spam so here's an image of the log. 谢谢

【问题讨论】:

    标签: salesforce testng apex


    【解决方案1】:

    您正在销毁地图中的旧条目,因为您正在调用accContacts.clear();。我认为对联系人的引用并没有完全消失,测试可能会通过insert addedContacts; 很好地插入它们 - 但它们不再在地图中了。

    更改调用以在每个循环中创建一个新列表。您可以重用变量名,只需分配新内存。 accContacts = New List&lt;Contact&gt;(); 在循环的开头而不是 clear 应该可以解决问题。

    【讨论】:

    • 谢谢@eyescream 成功了!
    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    相关资源
    最近更新 更多