Future Method and Mixed DML Errors in Salesforce.com
When we perform DML on setup and non-setup sObject simultaneously then mixed dml errors occurs.
To avoid mixed DML errors
1) Create a method that performs a DML operation on one type of sObject.
2) Create a second method that uses the future annotation to manipulate a second sObject type.
Apex Class
public class MixedDMLFuture {
public static void useFutureMethod() {
// First DML operation
Account a = new Account(Name='Acme');
insert a;
// This next operation (insert a user with a role)
// can't be mixed with the previous insert unless
// it is within a future method.
// Call future method to insert a user with a role.
UtilClass.insertUserWithProfileAndRole('username@abc.com', 'myAlias',
'emailAddress@abc.com', 'Bill','Business Head', 'CEO');
}
}
Apex Future Method
public class UtilClass {
@future
public static void insertUserWithProfileAndRole(
String userNameIs, String aliasIs, String emailAdd, String lastNameIs, String profileName, String roleName) {
When we perform DML on setup and non-setup sObject simultaneously then mixed dml errors occurs.
To avoid mixed DML errors
1) Create a method that performs a DML operation on one type of sObject.
2) Create a second method that uses the future annotation to manipulate a second sObject type.
Apex Class
public class MixedDMLFuture {
public static void useFutureMethod() {
// First DML operation
Account a = new Account(Name='Acme');
insert a;
// This next operation (insert a user with a role)
// can't be mixed with the previous insert unless
// it is within a future method.
// Call future method to insert a user with a role.
UtilClass.insertUserWithProfileAndRole('username@abc.com', 'myAlias',
'emailAddress@abc.com', 'Bill','Business Head', 'CEO');
}
}
Apex Future Method
public class UtilClass {
@future
public static void insertUserWithProfileAndRole(
String userNameIs, String aliasIs, String emailAdd, String lastNameIs, String profileName, String roleName) {
//Get the profile Id
Profile profile = [SELECT Id FROM Profile WHERE Name=:profile];
Profile profile = [SELECT Id FROM Profile WHERE Name=:profile];
//Get the role Id
UserRole role = [SELECT Id FROM UserRole WHERE Name=:role];
// Create new user with a non-null user role ID
User usr = new User(alias = aliasIs,
email=emailAdd,
emailencodingkey='UTF-8',
emailencodingkey='UTF-8',
lastname=lastNameIs,
languagelocalekey='en_US',
localesidkey='en_US',
languagelocalekey='en_US',
localesidkey='en_US',
profileid = profile.Id,
userroleid = role.Id,
timezonesidkey='America/Los_Angeles',
username=userNameIs);
insert usr;
}
}
Apex Test Class
============
username=userNameIs);
insert usr;
}
}
Apex Test Class
============
Mixed DML Operations in Test Methods :-
The System.runAs() block runs in the current user’s context. It creates a test user with a role and a test account, which is a mixed DML operation.
Using Test.startTest and Test.stopTest to bypass the mixed DML error in a Test Method.
@isTest
private class insertUserWithProfileAndRoleTest{
static testMethod void createTestUser(){
Profile pro = [Select Id From Profile Where Name = 'System Administrator'];
//Create setup sObject records (User)
User usr = new User();
usr.FirstName = 'First';
usr.LastName = 'Last';
usr.Email = 'first@test.com';
usr.Username = 'astest@test.com';
usr.Alias = 'first';
usr.ProfileId = pro.Id;
usr.TimeZoneSidKey = 'America/Denver';
usr.LocaleSidKey = 'en_US';
usr.EmailEncodingKey = 'UTF-8';
usr.LanguageLocaleKey = 'en_US';
insert usr;
system.debug('usr is ' + usr);
System.runas(usr){
//Create non-setup records & run tests here
}
}
}
No comments:
Post a Comment