我正在尝试在catch块中测试DmlException,但是我无法在单元测试中抛出DmlException错误。
我正在测试的代码将联系人所有者字段更新为相关帐户所有者。这是代码:
global class AccountUpdateContactOwnership implements Triggers.HandlerInterface {
Account[] newCollection = trigger.new;
Map<Id, Account> oldCollection = (Map<Id, Account>)trigger.oldMap;
Set<Id> accountIds = new Set<Id>();
global void handle() {
Map<Id, List<Contact>> accountToContacts = getAllContactsByAccount(getAccountIds());
updateContactOwnershipWhenAccountOwnershipChanges(accountToContacts);
}
private Set<Id> getAccountIds() {
for(Account a : newCollection) {
if(a.ownerId != oldCollection.get(a.Id).ownerId) accountIds.add(a.Id);
}
return accountIds;
}
private Map<Id, List<Contact>> getAllContactsByAccount(Set<Id> accountIds) {
Map<Id, List<Contact>> accountToContacts = new Map<Id, List<Contact>>();
if(!accountIds.isEmpty()) {
List<Contact> listContacts = new List<Contact>();
Map<Id, Contact> mapContact = new Map<Id, Contact>([select Id, AccountId, OwnerId From Contact Where accountId in: accountIds]);
for(Contact c : mapContact.values()) {
listContacts = accountToContacts.get(c.AccountId);
if(listContacts == null) {
listContacts = new List<Contact>();
accountToContacts.put(c.accountId, listContacts);
}
listContacts.add(c);
}
}
return accountToContacts;
}
private void updateContactOwnershipWhenAccountOwnershipChanges(Map<Id, List<Contact>> accountToContacts) {
if(!accountToContacts.isEmpty() && accountToContacts.size() > 0) {
List<Contact> contactsToUpdate = new List<Contact>();
for(Account a : newCollection) {
List<Contact> contacts = accountToContacts.get(a.Id);
if(!contacts.isEmpty() && contacts.size() > 0) {
for(Contact c : contacts) {
c.OwnerId = a.OwnerId;
contactsToUpdate.add(c);
}
}
}
if(!contactsToUpdate.isEmpty() && contactsToUpdate.size() > 0) {
try {
update contactsToUpdate;
}
catch(DmlException e) {
for(integer i=0;i<e.getNumDml();i++) {
System.debug(e.getDmlMessage(i));
}
}
}
}
}
}
现在,在我的单元测试中,我正在尝试测试catch块并捕获异常。
这是我的方法:
static testMethod void accountUpdateContactOwnershipNegativeTest() {
initialize();
System.Dmlexception ex;
test.startTest();
try {
testAccount.OwnerId = testContact1.Id;
update testAccount;
}
catch(DmlException e) {
ex = e;
}
test.stopTest();
}
initialize()设置数据(帐户和联系人)。我认为将帐户所有者设置为联系人会抛出DmlException,但它仍然处理好并且不会进入catch块。我也尝试将帐户所有者设置为null,但这也不起作用。如何强制DmlException?这是我不需要尝试捕获DmlException的情况吗?我已经阅读了很多关于在Salesforce中测试异常的难度的帖子,但还没有找到解决方案。
有人可以帮忙吗?
答案 0 :(得分:1)
我猜你在测试中没有异常,因为你已经在你的触发器代码上处理了它(第52-59行)。您不需要使用dml Exception测试负面情况,因为您在触发器的代码上处理它。