You need to sign in to do that
Don't have an account?

Anyone seen this before: System.DmlException: Insert failed. First exception on row 0; first error: MIXED_DML_OPERATION, DML operation on setup object is not permitted after you have updated a non-setup object (or vice versa)
I downloaded the Salesforce labs case assignment unmanaged package and hacked the trigger to round robin assign leads, which works great.
I tried to update the test code, but every time I run the test I get a MIXED_DML_OPERATION error on 4 different lines of code. I've researched the error and found some advice, but I haven't been able to implement the fixes that people suggested. Can any help me fix these errors?
Here is the test class:
@isTest
public class TestLeadAssignment{
static testMethod void myTest1() {
// This code runs as the system user
User u1;
try{
u1 = [select Id from User WHERE IsActive=True AND Profile.Name = 'System Administrator' LIMIT 1];
} catch (QueryException qe){
List<User> users = [SELECT Id, Profile.PermissionsModifyAllData FROM User WHERE IsActive = true LIMIT 1000];
for(User u : users){
if(u.Profile.PermissionsModifyAllData = true){
u1 = u;
break;
}
}
}
System.debug(u1);
//*****Create Queue
Group testGroup = new Group ();
testGroup.Name = 'TestQueue';
testGroup.Type = 'Queue';
insert testGroup;
QueueSObject testQueue = new QueueSObject();
testQueue.QueueId = testGroup.id;
testQueue.SObjectType = 'Lead';
insert testQueue;
// Second Queue
Group testGroup2 = new Group ();
testGroup2.Name = 'TestQueue2';
testGroup2.Type = 'Queue';
insert testGroup2;
QueueSObject testQueue2 = new QueueSObject();
testQueue2.QueueId = testGroup2.id;
testQueue2.SObjectType = 'Lead';
insert testQueue2;
test.starttest();
//Run test
//Assign Lead with out any Assignment Groups
Lead ld = new Lead (FirstName='Tim',LastName='Jones', Company='ABC Corp', tempOwnerID__c=testGroup2.id, OwnerID=u1.id); //tempOwnerID__c=testGroup2.id,
insert ld;
update ld;
//Create Assignment Group
Assignment_Group_Name__c ag1 = new Assignment_Group_Name__c (Name='TestAG', Type__c = 'Lead');
insert ag1;
//Add bad queue name
Assignment_Group_Queues__c agqBad = new Assignment_Group_Queues__c(name='Bad Queue',Assignment_Group_Name__c = ag1.id );
try {
insert agqBad;
} catch (DmlException e){
System.assert(e.getMessage().contains('CUSTOM_VALIDATION_EXCEPTION'), e.getMessage());
} //catch
test.stoptest();
}
static testMethod void myTest2() {
// This code runs as the system user
User u1;
try{
u1 = [select Id from User WHERE IsActive=True AND Profile.Name = 'System Administrator' LIMIT 1];
} catch (QueryException qe){
List<User> users = [SELECT Id, Profile.PermissionsModifyAllData FROM User WHERE IsActive = true LIMIT 1000];
for(User u : users){
if(u.Profile.PermissionsModifyAllData = true){
u1 = u;
break;
}
}
}
System.debug(u1);
//*****Create Queue
Group testGroup = new Group ();
testGroup.Name = 'TestQueue';
testGroup.Type = 'Queue';
insert testGroup;
QueueSObject testQueue = new QueueSObject();
testQueue.QueueId = testGroup.id;
testQueue.SObjectType = 'Lead';
insert testQueue;
// Second Queue
Group testGroup2 = new Group ();
testGroup2.Name = 'TestQueue2';
testGroup2.Type = 'Queue';
insert testGroup2;
QueueSObject testQueue2 = new QueueSObject();
testQueue2.QueueId = testGroup2.id;
testQueue2.SObjectType = 'Lead';
insert testQueue2;
test.starttest();
//Run test
//Create Assignment Group
Assignment_Group_Name__c ag1 = new Assignment_Group_Name__c (Name='TestAG', Type__c = 'Lead');
insert ag1;
//Add Good Queue to Assignment Group
Assignment_Group_Queues__c agq1 = new Assignment_Group_Queues__c(name=testGroup.Name ,Assignment_Group_Name__c = ag1.id );
insert agq1;
//Add User to Assignment Groups Users
Assignment_Groups__c agu1 = new Assignment_Groups__c (User__c = u1.id, Active__c='True', Group_Name__c = ag1.id, Last_Assignment__c = datetime.valueOf('2009-01-01 21:13:24') );
insert agu1;
Lead l2 = new Lead (FirstName='Tom',LastName='Dunn', Company='JKL Corp', tempOwnerID__c=testGroup2.id , OwnerID=testGroup.id); //Set owner ID to Queue
insert l2;
update l2;
test.stoptest();
}
static testMethod void myTest3() {
// This code runs as the system user
User u1;
try{
u1 = [select Id from User WHERE IsActive=True AND Profile.Name = 'System Administrator' LIMIT 1];
} catch (QueryException qe){
List<User> users = [SELECT Id, Profile.PermissionsModifyAllData FROM User WHERE IsActive = true LIMIT 1000];
for(User u : users){
if(u.Profile.PermissionsModifyAllData = true){
u1 = u;
break;
}
}
}
System.debug(u1);
//*****Create Queue
Group testGroup = new Group ();
testGroup.Name = 'TestQueue';
testGroup.Type = 'Queue';
insert testGroup;
QueueSObject testQueue = new QueueSObject();
testQueue.QueueId = testGroup.id;
testQueue.SObjectType = 'Lead';
insert testQueue;
test.starttest();
//Run test
//Create Assignment Group
Assignment_Group_Name__c ag1 = new Assignment_Group_Name__c (Name='TestAG', Type__c = 'Lead');
insert ag1;
//Add Good Queue to Assignment Group
Assignment_Group_Queues__c agq1 = new Assignment_Group_Queues__c(name=testGroup.Name ,Assignment_Group_Name__c = ag1.id );
insert agq1;
//Add User to Assignment Groups Users
Assignment_Groups__c agu1 = new Assignment_Groups__c (User__c = u1.id, Active__c='True', Group_Name__c = ag1.id, Last_Assignment__c = datetime.valueOf('2009-01-01 21:13:24') );
insert agu1;
Lead l3 = new Lead (FirstName='Dave',LastName='Barry', Company='CBS Corp', OwnerID=testGroup.id); //Set owner ID to Queue
insert l3;
update l3;
test.stoptest();
}
static testMethod void myTest4() {
// This code runs as the system user
User u1;
try{
u1 = [select Id from User WHERE IsActive=True AND Profile.Name = 'System Administrator' LIMIT 1];
} catch (QueryException qe){
List<User> users = [SELECT Id, Profile.PermissionsModifyAllData FROM User WHERE IsActive = true LIMIT 1000];
for(User u : users){
if(u.Profile.PermissionsModifyAllData = true){
u1 = u;
break;
}
}
}
System.debug(u1);
//*****Create Queue
Group testGroup = new Group ();
testGroup.Name = 'TestQueue';
testGroup.Type = 'Queue';
insert testGroup;
QueueSObject testQueue = new QueueSObject();
testQueue.QueueId = testGroup.id;
testQueue.SObjectType = 'Lead';
insert testQueue;
test.starttest();
//Run test
//Create Assignment Group
Assignment_Group_Name__c ag1 = new Assignment_Group_Name__c (Name='TestAG', Type__c = 'Lead');
insert ag1;
//Add Good Queue to Assignment Group
Assignment_Group_Queues__c agq1 = new Assignment_Group_Queues__c(name=testGroup.Name ,Assignment_Group_Name__c = ag1.id );
insert agq1;
//Test for AG-Queues already assigned to another Assignment Group
Assignment_Group_Queues__c agq2 = new Assignment_Group_Queues__c(name=testGroup.Name,Assignment_Group_Name__c = ag1.id );
try {
insert agq2;
} catch (DmlException e){
System.assert(e.getMessage().contains('CUSTOM_VALIDATION_EXCEPTION'), e.getMessage());
} //catch
test.stoptest();
}
}
I tried to update the test code, but every time I run the test I get a MIXED_DML_OPERATION error on 4 different lines of code. I've researched the error and found some advice, but I haven't been able to implement the fixes that people suggested. Can any help me fix these errors?
Here is the test class:
@isTest
public class TestLeadAssignment{
static testMethod void myTest1() {
// This code runs as the system user
User u1;
try{
u1 = [select Id from User WHERE IsActive=True AND Profile.Name = 'System Administrator' LIMIT 1];
} catch (QueryException qe){
List<User> users = [SELECT Id, Profile.PermissionsModifyAllData FROM User WHERE IsActive = true LIMIT 1000];
for(User u : users){
if(u.Profile.PermissionsModifyAllData = true){
u1 = u;
break;
}
}
}
System.debug(u1);
//*****Create Queue
Group testGroup = new Group ();
testGroup.Name = 'TestQueue';
testGroup.Type = 'Queue';
insert testGroup;
QueueSObject testQueue = new QueueSObject();
testQueue.QueueId = testGroup.id;
testQueue.SObjectType = 'Lead';
insert testQueue;
// Second Queue
Group testGroup2 = new Group ();
testGroup2.Name = 'TestQueue2';
testGroup2.Type = 'Queue';
insert testGroup2;
QueueSObject testQueue2 = new QueueSObject();
testQueue2.QueueId = testGroup2.id;
testQueue2.SObjectType = 'Lead';
insert testQueue2;
test.starttest();
//Run test
//Assign Lead with out any Assignment Groups
Lead ld = new Lead (FirstName='Tim',LastName='Jones', Company='ABC Corp', tempOwnerID__c=testGroup2.id, OwnerID=u1.id); //tempOwnerID__c=testGroup2.id,
insert ld;
update ld;
//Create Assignment Group
Assignment_Group_Name__c ag1 = new Assignment_Group_Name__c (Name='TestAG', Type__c = 'Lead');
insert ag1;
//Add bad queue name
Assignment_Group_Queues__c agqBad = new Assignment_Group_Queues__c(name='Bad Queue',Assignment_Group_Name__c = ag1.id );
try {
insert agqBad;
} catch (DmlException e){
System.assert(e.getMessage().contains('CUSTOM_VALIDATION_EXCEPTION'), e.getMessage());
} //catch
test.stoptest();
}
static testMethod void myTest2() {
// This code runs as the system user
User u1;
try{
u1 = [select Id from User WHERE IsActive=True AND Profile.Name = 'System Administrator' LIMIT 1];
} catch (QueryException qe){
List<User> users = [SELECT Id, Profile.PermissionsModifyAllData FROM User WHERE IsActive = true LIMIT 1000];
for(User u : users){
if(u.Profile.PermissionsModifyAllData = true){
u1 = u;
break;
}
}
}
System.debug(u1);
//*****Create Queue
Group testGroup = new Group ();
testGroup.Name = 'TestQueue';
testGroup.Type = 'Queue';
insert testGroup;
QueueSObject testQueue = new QueueSObject();
testQueue.QueueId = testGroup.id;
testQueue.SObjectType = 'Lead';
insert testQueue;
// Second Queue
Group testGroup2 = new Group ();
testGroup2.Name = 'TestQueue2';
testGroup2.Type = 'Queue';
insert testGroup2;
QueueSObject testQueue2 = new QueueSObject();
testQueue2.QueueId = testGroup2.id;
testQueue2.SObjectType = 'Lead';
insert testQueue2;
test.starttest();
//Run test
//Create Assignment Group
Assignment_Group_Name__c ag1 = new Assignment_Group_Name__c (Name='TestAG', Type__c = 'Lead');
insert ag1;
//Add Good Queue to Assignment Group
Assignment_Group_Queues__c agq1 = new Assignment_Group_Queues__c(name=testGroup.Name ,Assignment_Group_Name__c = ag1.id );
insert agq1;
//Add User to Assignment Groups Users
Assignment_Groups__c agu1 = new Assignment_Groups__c (User__c = u1.id, Active__c='True', Group_Name__c = ag1.id, Last_Assignment__c = datetime.valueOf('2009-01-01 21:13:24') );
insert agu1;
Lead l2 = new Lead (FirstName='Tom',LastName='Dunn', Company='JKL Corp', tempOwnerID__c=testGroup2.id , OwnerID=testGroup.id); //Set owner ID to Queue
insert l2;
update l2;
test.stoptest();
}
static testMethod void myTest3() {
// This code runs as the system user
User u1;
try{
u1 = [select Id from User WHERE IsActive=True AND Profile.Name = 'System Administrator' LIMIT 1];
} catch (QueryException qe){
List<User> users = [SELECT Id, Profile.PermissionsModifyAllData FROM User WHERE IsActive = true LIMIT 1000];
for(User u : users){
if(u.Profile.PermissionsModifyAllData = true){
u1 = u;
break;
}
}
}
System.debug(u1);
//*****Create Queue
Group testGroup = new Group ();
testGroup.Name = 'TestQueue';
testGroup.Type = 'Queue';
insert testGroup;
QueueSObject testQueue = new QueueSObject();
testQueue.QueueId = testGroup.id;
testQueue.SObjectType = 'Lead';
insert testQueue;
test.starttest();
//Run test
//Create Assignment Group
Assignment_Group_Name__c ag1 = new Assignment_Group_Name__c (Name='TestAG', Type__c = 'Lead');
insert ag1;
//Add Good Queue to Assignment Group
Assignment_Group_Queues__c agq1 = new Assignment_Group_Queues__c(name=testGroup.Name ,Assignment_Group_Name__c = ag1.id );
insert agq1;
//Add User to Assignment Groups Users
Assignment_Groups__c agu1 = new Assignment_Groups__c (User__c = u1.id, Active__c='True', Group_Name__c = ag1.id, Last_Assignment__c = datetime.valueOf('2009-01-01 21:13:24') );
insert agu1;
Lead l3 = new Lead (FirstName='Dave',LastName='Barry', Company='CBS Corp', OwnerID=testGroup.id); //Set owner ID to Queue
insert l3;
update l3;
test.stoptest();
}
static testMethod void myTest4() {
// This code runs as the system user
User u1;
try{
u1 = [select Id from User WHERE IsActive=True AND Profile.Name = 'System Administrator' LIMIT 1];
} catch (QueryException qe){
List<User> users = [SELECT Id, Profile.PermissionsModifyAllData FROM User WHERE IsActive = true LIMIT 1000];
for(User u : users){
if(u.Profile.PermissionsModifyAllData = true){
u1 = u;
break;
}
}
}
System.debug(u1);
//*****Create Queue
Group testGroup = new Group ();
testGroup.Name = 'TestQueue';
testGroup.Type = 'Queue';
insert testGroup;
QueueSObject testQueue = new QueueSObject();
testQueue.QueueId = testGroup.id;
testQueue.SObjectType = 'Lead';
insert testQueue;
test.starttest();
//Run test
//Create Assignment Group
Assignment_Group_Name__c ag1 = new Assignment_Group_Name__c (Name='TestAG', Type__c = 'Lead');
insert ag1;
//Add Good Queue to Assignment Group
Assignment_Group_Queues__c agq1 = new Assignment_Group_Queues__c(name=testGroup.Name ,Assignment_Group_Name__c = ag1.id );
insert agq1;
//Test for AG-Queues already assigned to another Assignment Group
Assignment_Group_Queues__c agq2 = new Assignment_Group_Queues__c(name=testGroup.Name,Assignment_Group_Name__c = ag1.id );
try {
insert agq2;
} catch (DmlException e){
System.assert(e.getMessage().contains('CUSTOM_VALIDATION_EXCEPTION'), e.getMessage());
} //catch
test.stoptest();
}
}
Use system.runAs after insert User in code.
For Example:
@isTest
public class TestLeadAssignment{
static testMethod void myTest1() {
//Insert User
System.runAs(insertedUser){
// Do code for DML other object rather than User
}
}
}
Regards
Tejpal
All Answers
http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dml_non_mix_sobjects_test_methods.htm
Use system.runAs after insert User in code.
For Example:
@isTest
public class TestLeadAssignment{
static testMethod void myTest1() {
//Insert User
System.runAs(insertedUser){
// Do code for DML other object rather than User
}
}
}
Regards
Tejpal