function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Varun TejaVarun Teja 

How to write test class for Batch Apex job

global class AccountContactCaseOpporBatch implements Database.Batchable<sObject> {
     global Database.QueryLocator start(Database.BatchableContext bc) {
        return Database.getQueryLocator(
            'SELECT ID, Name, Archival_Number_Of_Cases_Count__c, Archival_Number_Of_Contacts_Count__c, Archival_Number_Of_Oppt_Count__c,'+
            '(SELECT ID, Name, CreatedDate FROM Contacts Where CreatedDate <= LAST_N_DAYS:5),'+
            '(SELECT ID, Name, CreatedDate FROM Opportunities Where CreatedDate <= LAST_N_DAYS:5 ),'+
            '(SELECT ID, CaseNumber, CreatedDate FROM Cases Where CreatedDate <= LAST_N_DAYS:5) FROM Account'
        );
    }
    
    global void execute(Database.BatchableContext bc, List<Account> scope){
        List<Account> accounts = new List<Account>();
        List<Contact> contacts = new List<Contact>();
        List<Opportunity> opportunities = new List<Opportunity>();
        List<Case> cases = new List<Case>();
        List<ArchivalTable__c> archivTableList = new List<ArchivalTable__c>();
        
        for (Account accou : scope) {
             Integer contactProcessed = 0;
             Integer opportunityProcessed = 0;
             Integer caseProcessed = 0;

            for (Contact contct : accou.contacts) {
                //System.debug(' List of Contact Records ---'+contct);
                contacts.add(contct);
                contactProcessed = contactProcessed + 1;
            }
            for (Opportunity opport : accou.opportunities) {
                //System.debug(' List of Opportunity Records ---'+opport);
                opportunities.add(opport);
                opportunityProcessed = opportunityProcessed + 1;
            }
            for (Case cas : accou.cases) {
                //System.debug(' List of Case Records ---'+cas);
                cases.add(cas);
                caseProcessed = caseProcessed + 1;
            }
            
            if (accou.Archival_Number_Of_Cases_Count__c==null || accou.Archival_Number_Of_Cases_Count__c==0) {
                accou.Archival_Number_Of_Cases_Count__c = caseProcessed;
            }else {
                accou.Archival_Number_Of_Cases_Count__c = accou.Archival_Number_Of_Cases_Count__c + caseProcessed;
            }
            
            if (accou.Archival_Number_Of_Contacts_Count__c==null || accou.Archival_Number_Of_Contacts_Count__c==0) {
                accou.Archival_Number_Of_Contacts_Count__c = contactProcessed;
            }else {
                accou.Archival_Number_Of_Contacts_Count__c = accou.Archival_Number_Of_Contacts_Count__c + contactProcessed;
            }
            
            if (accou.Archival_Number_Of_Oppt_Count__c==null || accou.Archival_Number_Of_Oppt_Count__c==0) {
                accou.Archival_Number_Of_Oppt_Count__c = opportunityProcessed;
            }else {
                accou.Archival_Number_Of_Oppt_Count__c = accou.Archival_Number_Of_Oppt_Count__c + opportunityProcessed;
            }
            
            accounts.add(accou);
            
               //System.debug(' List of Accounts  Records ---'+accounts);
               System.debug('Account Name  '+accou.Name);
            
                ArchivalTable__c archieveData = new ArchivalTable__c();
                archieveData.ArchivalAccount__c = String.valueOf(accou.Id); 
                
                 System.debug('archieveData.ArchivalAccount__c--  '+archieveData.ArchivalAccount__c);
                    archieveData.Number_Of_Contacts_Count__c = contactProcessed;
           
                //System.debug('archieveData.Number_Of_Contacts_Count__c--  '+archieveData.Number_Of_Contacts_Count__c);

                    archieveData.Number_Of_Oppt_Count__c = opportunityProcessed;

                //System.debug('archieveData.Number_Of_Oppt_Count__c--  '+archieveData.Number_Of_Oppt_Count__c);

                    archieveData.Number_Of_Cases_Count__c = caseProcessed;

               //System.debug('archieveData.Number_Of_Cases_Count__c--  '+archieveData.Number_Of_Cases_Count__c);
                archieveData.Date__c = Date.today();
                
                archivTableList.add(archieveData);
            //System.debug('------archivTableList--  '+archivTableList);
         
        }
        
        if(cases.size()>0){
        delete cases;
        }
       
        if(contacts.size()>0){
        delete contacts;
        }
        if(opportunities.size()>0){
        delete opportunities;
        }
        
        if(archivTableList.size()>0){
        insert archivTableList;
        } 

        if(accounts.size()>0){
        update accounts;
        }
    } 

    global void finish(Database.BatchableContext bc){
        
        
        System.debug(' Records processed --- '+bc.getJobId());
        AsyncApexJob result = [SELECT Id, Status, NumberOfErrors, 
            JobItemsProcessed,
            TotalJobItems, CreatedBy.Email
            FROM AsyncApexJob
            WHERE Id = :bc.getJobId()];
        
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        String[] toAddresses = new String[] {result.CreatedBy.Email};
            mail.setToAddresses(toAddresses);
        mail.setSubject('Status of Contacts,opportunities and cases batch job -- ' + result.Status);
        mail.setPlainTextBody
            ('The batch Apex job processed ' + result.TotalJobItems +
             ' batches with '+ result.NumberOfErrors + ' failures.');
        Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
    } 
}

Thanks in Advance
mritzimritzi
Following is a skeleton to test Batch class.
you can make changes according to your code and then execute it.
 
@isTest
public class AccountContactCaseOpporBatchTest {
    @testSetup public static void createData(){
        //create accounts, contacts, opportunities, case here
        //make relationships, eg -> insert accountList -> contactList[0].AccountId = accountList[0].Id -> insert contactList
    }
    @isTest public static void executeTest(){
        AccountContactCaseOpporBatch batch = new AccountContactCaseOpporBatchTest();
        Test.startTest();
        Database.executeBatch(batch);
        Test.startTest();
        //one or multiple aseertions to check validity
        //System.assertEquals(actual value, expected value)

    }
    @isTest public static void executeTest1(){
        //change data created in test setup to ensure all your if/else conditions are covered at leat once
        /*
        AccountContactCaseOpporBatch batch = new AccountContactCaseOpporBatchTest();
        Test.startTest();
        Database.executeBatch(batch);
        Test.startTest();
        //one or multiple aseertions to check validity
        //System.assertEquals(actual value, expected value)
        */
    }
}

Mark this as BEST ANSWER, if it solves your problem
 
Varun TejaVarun Teja
Thanks mritzi,
I'm new to salesforce, Can you please give me complete code.Help me on this
sfdcMonkey.comsfdcMonkey.com
Hi Try following test class this will gives you around 95% code coverge :
@isTest
public class AccountContactCaseOpporBatchTest {
    public static testmethod void  unitTest(){
        account acc = new account();
         acc.Name = 'test acc' ;
        // add all required fields here
        insert acc;
        
        contact cc = new contact ();
          cc.LastName = 'test';
          cc.AccountId = acc.Id;
        // add all required fields here
       insert cc;
        
        opportunity opp = new opportunity();
          opp.Name = 'test opp';
          opp.CloseDate = system.today();
          opp.StageName = 'closed Won';
          opp.AccountId = acc.Id;
        
        insert opp;
        
        Case caseObj = new Case(
            ContactId = cc.Id,
            AccountId = acc.Id,
            Status = 'Working',
            Origin = 'Phone');
        
        insert caseObj;
        
        
        AccountContactCaseOpporBatch oACCOB = new AccountContactCaseOpporBatch();
         
           Database.executeBatch(oACCOB);
         
        
    }
}

Thank, let us know if it helps you