Tuesday 18 July 2017

How to write test class for Scheduler /Schedulable class in Salesforce

Sample Batch job

global class AccountUpdateBatchJob implements Database.Batchable<sObject> 
    global Database.QueryLocator start(Database.BatchableContext BC)     {
        String query = 'SELECT Id,Name FROM Account';                
        return Database.getQueryLocator(query);     
    global void execute(Database.BatchableContext BC, List<Account> scope)     {        
        for(Account a : scope)        
            a.Name = a.Name + 'Updated by Batch job';        
        update scope;       
    global void finish(Database.BatchableContext BC) {    }

Scheduler Class For Batch Apex

global class AccountUpdateBatchJobscheduled implements Schedulable 
    global void execute(SchedulableContext sc) 
        AccountUpdateBatchJob b = new AccountUpdateBatchJob(); 

Test Class for Scheduler Class

private class AccountUpdateBatchJobscheduledTest

    static testmethod void schedulerTest() 
        String CRON_EXP = '0 0 0 15 3 ? *';
        // Create your test data
        Account acc = new Account();
        acc.name= 'test';
        insert acc;

            String jobId = System.schedule('ScheduleApexClassTest',  CRON_EXP, new AccountUpdateBatchJobscheduled());
            CronTrigger ct = [SELECT Id, CronExpression, TimesTriggered, NextFireTime FROM CronTrigger WHERE id = :jobId];
            System.assertEquals(CRON_EXP, ct.CronExpression);
            System.assertEquals(0, ct.TimesTriggered);

        // Add assert here to validate result

Please check below post for Batch job
1) http://amitsalesforce.blogspot.com/2016/02/batch-apex-in-salesforce-test-class-for.html

Please check below post for more detail
1) https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_scheduler.htm

Amit Chaudhary


  1. Hi Amit,

    This is great and I use a similar test class format which works for one class that I wrote but I used it again for another and I cannot get the scheduled batch to fire in the test class. I posted it here: https://salesforce.stackexchange.com/questions/257958/test-class-for-a-scheduled-batch-is-not-firing-the-batch

    Any ideas?