How to test Batch Apex result in Test class in Salesforce?

The call to Database.executeBatch should be included within the Test.startTest and Test.stopTest block. The job executes after the call to Test.stopTest. Any asynchronous code included within Test.startTest and Test.stopTest is executed synchronously after Test.stopTest.

Sample Batch Apex:


  1. global class AccountBatch Implements Database.Batchable <sObject> {  
  2.   
  3.     global Database.queryLocator start( Database.BatchableContext bc ) {  
  4.       
  5.         String SOQL = 'SELECT Id, Industry FROM Account';  
  6.         return Database.getQueryLocator(SOQL);  
  7.           
  8.     }  
  9.   
  10.     global void execute( Database.BatchableContext bc, List < Account > listAccounts ) {  
  11.       
  12.         for ( Account objAct : listAccounts ) {  
  13.           
  14.             objAct.Industry = 'Energy';  
  15.               
  16.         }  
  17.       
  18.         update listAccounts;  
  19.           
  20.     }  
  21.   
  22.     global void finish( Database.BatchableContext bc ) {  
  23.       
  24.         AsyncApexJob a = [ SELECT Id, Status, NumberOfErrors, JobItemsProcessed, TotalJobItems, CreatedById    
  25.                              FROM AsyncApexJob    
  26.                             WHERE Id =: bc.getJobId() ];    
  27.         Messaging.SingleEmailMessage batchEmail = new Messaging.SingleEmailMessage();    
  28.         batchEmail.setTargetObjectId( a.CreatedById );    
  29.         batchEmail.setSubject( 'Asset Delete Batch ' + a.Status );    
  30.         batchEmail.setPlainTextBody( 'Jobs processed ' + a.JobItemsProcessed + ' with '+ a.NumberOfErrors + ' failures.' );    
  31.         batchEmail.setSaveAsActivity( false );    
  32.         Messaging.sendEmail( new Messaging.SingleEmailMessage[] { batchEmail } );   
  33.           
  34.     }  
  35.   
  36. }  

Sample Test class:


  1. @isTest  
  2. private class AssetDeleteBatchTest {  
  3.       
  4.     static testMethod void testAssetsDel() {  
  5.           
  6.         List < Account > insertAcc = new List< Account >();  
  7.         for ( Integer a = 0; a < 3; a++ ) {  
  8.           
  9.             Account acc = new Account( Name = 'Test Account' + String.valueOf( a ), Industry = 'Biotechnology' );  
  10.             insertAcc.add( acc );  
  11.                   
  12.         }  
  13.         insert insertAcc;  
  14.           
  15.         Test.startTest();  
  16.         AccountBatch obj = new AccountBatch();  
  17.         Database.executeBatch( obj );  
  18.         Test.stopTest();  
  19.           
  20.         /* 
  21.             Once Test.stopTest() hits, the batch job runs synchronously. 
  22.             Once the batch job execute method is completed, the below codes are executed. 
  23.         */  
  24.         List < Account > listAccounts = [ SELECT Id FROM Account WHERE Industry = 'Energy' ];  
  25.         system.assertEquals( 3, listAccounts.size() );  
  26.           
  27.     }  
  28.       
  29. }  


No comments:

Post a Comment