You need to sign in to do that
Don't have an account?
William Keam
Help with testing a trigger that calls @future method in a separate APEX class
Hello everyone,
I have hit a wall and need help on how to test @future methods which are called from a trigger.
I think it has something do with the fact that @future methods are no necessarily processed immediately and as such my assertions are not passing, any help on how to get my code covered would be greatly appreciated,
What the trigger does is reassigns open and waiting cases to a queue when a user is disabled.
The trigger:
trigger user_deactivated_reassign_case on User (before update) {
for(User u : trigger.new){
User oldUsr = Trigger.oldMap.get(u.Id);
if(oldUsr.IsActive==TRUE && u.IsActive==FALSE){
User newUsr = Trigger.newMap.get(u.Id);
string recordIds = u.Id;
user_deactivation_reassign_case_class.reassign_case(recordIds);
}
}
}
The @future Apex Class:
public class user_deactivation_reassign_case_class {
@future
public static void reassign_case(string recordIds){
List<Case> cas = [SELECT Id, Type FROM Case WHERE OwnerId=:recordIds];
List<Case> casesTobeUpdated = new List<Case>();
for(Case currentCase : cas){
if(currentCase.Status=='Open'||currentCase.Status=='Waiting Response'||currentCase.Status=='On Hold'){
if(currentCase.Type=='AU.COM'||currentCase.Type=='Customer Service'){
currentCase.OwnerId='00G90000001mq6F'; //Premium Support L2
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Management'){
currentCase.OwnerId='00G90000001mq5m'; //Management
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Administration'||currentCase.Type=='Domain Dispute'){
currentCase.OwnerId='00G90000001mq65'; //Premium Admin
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='EDU.AU'||currentCase.Type=='GOV.AU'||currentCase.Type=='Corporate'){
currentCase.OwnerId='00G90000001mzrl'; //Corporate
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='VPS Unmanaged'||currentCase.Type=='VPS Managed'){
currentCase.OwnerId='00G90000001nJfA'; //VPS Unmanaged
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Sales'||currentCase.Type=='Social Media Sales'||currentCase.Type=='Online Marketing Sales'){
currentCase.OwnerId='00G90000001mzrH'; //Retail Sales
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Online Marketing Support'){
currentCase.OwnerId='00G90000001mzrR'; //Online Marketing Support
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Web Design'){
currentCase.OwnerId='00G90000001mzT4'; //Web Design
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Website Security'){
currentCase.OwnerId='00G90000001nAl0'; //Website Security
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Credit Control'){
currentCase.OwnerId='00G90000001nAlK'; //Credit Control
casesTobeUpdated.add(currentCase);
}
else{
currentCase.OwnerId='00G90000001mq6F'; //Premium Support L2
casesTobeUpdated.add(currentCase);
}
}
}
update casesTobeUpdated;
}
}
And the test class which I can't figure out:
@isTest
public class user_deactivation_reassign_case_test {
public static testmethod void test_user_termination(){
User thisUser = [SELECT Id FROM USER WHERE Name='System Automation'];
system.runAs(thisUser){
User u = new User(FirstName='Test',
LastName='Test',
Username='apextest@netregistry.com',
Email='apextest@netregistry.com',
Alias='test',
CommunityNickname='test',
TimeZoneSidKey='Australia/Sydney',
LocaleSidKey='en_US',
EmailEncodingKey='UTF-8',
ProfileId='00e90000001NAum',
LanguageLocaleKey='en_US');
insert u;
Account acc = new Account(Account_Ref__c='1',Name='Test', Reseller_Id__c=1, Virtualisation_Id__c=1);
insert acc;
Case cas = new Case (AccountId=acc.Id,OwnerId=u.Id,Type='AU.COM',Status='Open',Brand__c='Netregistry');
insert cas;
update u;
string recordIds = u.Id;
system.assertEquals(cas.OwnerId, '00G90000001mq6F');
}
}
}
I have read other posts saying I need to use Test.startTest(); and Test.stopTest(); but I can't figure out where this fits into a @future class being called via a trigger
I have hit a wall and need help on how to test @future methods which are called from a trigger.
I think it has something do with the fact that @future methods are no necessarily processed immediately and as such my assertions are not passing, any help on how to get my code covered would be greatly appreciated,
What the trigger does is reassigns open and waiting cases to a queue when a user is disabled.
The trigger:
trigger user_deactivated_reassign_case on User (before update) {
for(User u : trigger.new){
User oldUsr = Trigger.oldMap.get(u.Id);
if(oldUsr.IsActive==TRUE && u.IsActive==FALSE){
User newUsr = Trigger.newMap.get(u.Id);
string recordIds = u.Id;
user_deactivation_reassign_case_class.reassign_case(recordIds);
}
}
}
The @future Apex Class:
public class user_deactivation_reassign_case_class {
@future
public static void reassign_case(string recordIds){
List<Case> cas = [SELECT Id, Type FROM Case WHERE OwnerId=:recordIds];
List<Case> casesTobeUpdated = new List<Case>();
for(Case currentCase : cas){
if(currentCase.Status=='Open'||currentCase.Status=='Waiting Response'||currentCase.Status=='On Hold'){
if(currentCase.Type=='AU.COM'||currentCase.Type=='Customer Service'){
currentCase.OwnerId='00G90000001mq6F'; //Premium Support L2
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Management'){
currentCase.OwnerId='00G90000001mq5m'; //Management
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Administration'||currentCase.Type=='Domain Dispute'){
currentCase.OwnerId='00G90000001mq65'; //Premium Admin
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='EDU.AU'||currentCase.Type=='GOV.AU'||currentCase.Type=='Corporate'){
currentCase.OwnerId='00G90000001mzrl'; //Corporate
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='VPS Unmanaged'||currentCase.Type=='VPS Managed'){
currentCase.OwnerId='00G90000001nJfA'; //VPS Unmanaged
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Sales'||currentCase.Type=='Social Media Sales'||currentCase.Type=='Online Marketing Sales'){
currentCase.OwnerId='00G90000001mzrH'; //Retail Sales
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Online Marketing Support'){
currentCase.OwnerId='00G90000001mzrR'; //Online Marketing Support
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Web Design'){
currentCase.OwnerId='00G90000001mzT4'; //Web Design
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Website Security'){
currentCase.OwnerId='00G90000001nAl0'; //Website Security
casesTobeUpdated.add(currentCase);
}
else if(currentCase.Type=='Credit Control'){
currentCase.OwnerId='00G90000001nAlK'; //Credit Control
casesTobeUpdated.add(currentCase);
}
else{
currentCase.OwnerId='00G90000001mq6F'; //Premium Support L2
casesTobeUpdated.add(currentCase);
}
}
}
update casesTobeUpdated;
}
}
And the test class which I can't figure out:
@isTest
public class user_deactivation_reassign_case_test {
public static testmethod void test_user_termination(){
User thisUser = [SELECT Id FROM USER WHERE Name='System Automation'];
system.runAs(thisUser){
User u = new User(FirstName='Test',
LastName='Test',
Username='apextest@netregistry.com',
Email='apextest@netregistry.com',
Alias='test',
CommunityNickname='test',
TimeZoneSidKey='Australia/Sydney',
LocaleSidKey='en_US',
EmailEncodingKey='UTF-8',
ProfileId='00e90000001NAum',
LanguageLocaleKey='en_US');
insert u;
Account acc = new Account(Account_Ref__c='1',Name='Test', Reseller_Id__c=1, Virtualisation_Id__c=1);
insert acc;
Case cas = new Case (AccountId=acc.Id,OwnerId=u.Id,Type='AU.COM',Status='Open',Brand__c='Netregistry');
insert cas;
update u;
string recordIds = u.Id;
system.assertEquals(cas.OwnerId, '00G90000001mq6F');
}
}
}
I have read other posts saying I need to use Test.startTest(); and Test.stopTest(); but I can't figure out where this fits into a @future class being called via a trigger
update u;
Test.stopTest();
1) load your test data
2) Test.startTest()
3) Test code
4) Test.stopTest()
5) Asserts
look into the below link to understand how startTest and stopTest helps.
https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_test.htm#apex_System_Test_startTest