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
Ann rdyAnn rdy 

test classes batch

Hi 
I have an issue with a batch class which updates the custome field as Active, Inactive or frozen. Its is working fine but test class is failing for this.

Could someone help with this

Batch Class:

global class UserUpdateBatch implements Database.Batchable<sObject> {

    Public String query;

    global Database.QueryLocator start(Database.BatchableContext BC) {
       //if(!Test.isRunningTest()){
        query = 'SELECT Id, isActive, Status__c FROM User'+(Test.isRunningTest()?' LIMIT 200':'');
      //}  
        return Database.getQueryLocator(query);
    }

    global void execute(Database.BatchableContext BC, List<User> scope) {    
        List<Id> usrLogLst = new List<Id>();
        for(UserLogin ul : [SELECT UserId, isFrozen from UserLogin where isFrozen = true and UserId IN: scope]){
            usrLogLst.add(ul.userid);
        }
        
        for(User usr : scope){
            if(usrLogLst.contains(usr.id)){
                usr.status__c = 'Frozen';
            }
            else{
                if(usr.isActive==true){
                    usr.status__c = 'Active';
                }
                else{
                    usr.status__c = 'Inactive';
                }
            }
        }

        Database.SaveResult [] updateResult = Database.update(scope, false);
        
        for (Database.SaveResult r : updateResult)
        
        {
            if (!r.isSuccess()) 
            {
                for (Database.Error e : r.getErrors())
            { system.debug('Error'+e); }
            
            }
        
        }
               update scope;
    }

    global void finish(Database.BatchableContext BC) {
    }
}

Test Class covering 14% but failed
Error MessageSystem.UnexpectedException: No more than one executeBatch can be called from within a test method. Please make sure the iterable returned from your start method matches the batch size, resulting in one executeBatch invocation.​

@isTest(SeeAllData=false)
private class TestRunAs {
    public static testMethod void testRunAs() {
        
        Profile p = [SELECT Id FROM Profile WHERE Name='System Administrator']; 
        User u = new User(Alias = 'standt', Email='standarduser121we@testorg.com', 
            EmailEncodingKey='UTF-8', LastName='Testing', LanguageLocaleKey='en_US', 
            LocaleSidKey='en_US', ProfileId = p.Id, 
            TimeZoneSidKey='America/Los_Angeles', UserName='standarduse91we233r@testorg.com');
            insert u;
        System.runas(u){
        
            Test.StartTest();
                UserUpdateBatch up =new UserUpdateBatch();
            
           Database.executeBatch(up,13);
           
           test.stoptest(); 
            //   System.abortJob(batchJobId);
    
     }
        }
    }

Test Class Passed but zero code coverage:

@isTest
private class UserUpdateBatch_Test{
Public static TestMethod Void TestActiveUser() {
        Profile p = [Select Id From Profile Where Name='System Administrator'];

        User TestUser = New User( Alias = 'testuser', Email='Moo987@testFrozenUser.com',
         LastName= 'Testme', Firstname= 'you', Languagelocalekey= 'en_US', 
        LocaleSidKey='en_US', Status__c = 'Active', TimeZoneSidkey='America/Los_Angeles', ProfileId=p.id,
         UserName= 'Moo987@testFrozenUser.com', EmailEncodingKey= 'UTF-8');
        insert TestUser;

    test.StartTest();

  ID batchjobid = Database.executeBatch(new UserupdateBatch());
    System.abortJob(batchjobid);

    test.StopTest(); 

        User assertUser= [select Id, Username, Status__c From User Where id=:TestUser.id][0];
     
        System.assertEquals('Active', assertUser.Status__c);
    
    }

Public Static TestMethod Void TestInActiveUser() {

        Profile p = [Select Id From Profile Where Name='System Administrator'];

        User TestUser = New User( Alias = 'Newuser', Email='Moo987@testFrozenUser.com', 
        LastName= 'Testme', Firstname= 'you', Languagelocalekey= 'en_US', 
        EmailEncodingKey= 'UTF-8', Status__c = 'Inactive', LocaleSidKey='en_US', 
        Profileid= P.id, TimeZoneSidkey='America/Los_Angeles',
        UserName= 'Moo987@testFrozenUser.com');
        List<User> lstUsr = new List <User>();                  
        Database.SaveResult userInsertResult= Database.insert(TestUser);
        lstUsr.add(TestUser);
        UserUpdateBatch sh1 = new UserUpdateBatch();
        
        //String sch = '0 0 23 * * ?'; system.schedule('Test', sch, sh1); 
        test.StartTest();
        testUser.IsActive =False;
        Update testuser;
        
   ID batchjobid = Database.executeBatch(new UserupdateBatch());
    System.abortJob(batchJobId);
    
    test.StopTest();

        User assertUser = [Select Id, Username, Status__c From User Where id=:TestUser.id][0];

        System.assertEquals('Inactive', assertUser.Status__c);

 }
}
Best Answer chosen by Ann rdy
Raj VakatiRaj Vakati
Use below code
 
global class UserUpdateBatch implements Database.Batchable<sObject> {

    Public String query;

    global Database.QueryLocator start(Database.BatchableContext BC) {
       //if(!Test.isRunningTest()){
        query = 'SELECT Id, isActive, Status__c FROM User LIMIT 200');
      //}  
        return Database.getQueryLocator(query);
    }

    global void execute(Database.BatchableContext BC, List<User> scope) {    
        List<Id> usrLogLst = new List<Id>();
        for(UserLogin ul : [SELECT UserId, isFrozen from UserLogin where isFrozen = true and UserId IN: scope]){
            usrLogLst.add(ul.userid);
        }
        
        for(User usr : scope){
            if(usrLogLst.contains(usr.id)){
                usr.status__c = 'Frozen';
            }
            else{
                if(usr.isActive==true){
                    usr.status__c = 'Active';
                }
                else{
                    usr.status__c = 'Inactive';
                }
            }
        }

        Database.SaveResult [] updateResult = Database.update(scope, false);
        
        for (Database.SaveResult r : updateResult)
        
        {
            if (!r.isSuccess()) 
            {
                for (Database.Error e : r.getErrors())
            { system.debug('Error'+e); }
            
            }
        
        }
               update scope;
    }

    global void finish(Database.BatchableContext BC) {
    }
}
 
@isTest
private class UserUpdateBatch_Test{
Public static TestMethod Void TestActiveUser() {
        Profile p = [Select Id From Profile Where Name='System Administrator'];

        User TestUser = New User( Alias = 'testuser', Email='Moo987@testFrozenUser.com',
         LastName= 'Testme', Firstname= 'you', Languagelocalekey= 'en_US', 
        LocaleSidKey='en_US', Status__c = 'Active', TimeZoneSidkey='America/Los_Angeles', ProfileId=p.id,
         UserName= 'Moo987@testFrozenUser.com', EmailEncodingKey= 'UTF-8');
        insert TestUser;

    test.StartTest();

		ID batchjobid = Database.executeBatch(new UserupdateBatch());
   
    test.StopTest(); 

        User assertUser= [select Id, Username, Status__c From User Where id=:TestUser.id][0];
     
        System.assertEquals('Active', assertUser.Status__c);
    
    }

Public Static TestMethod Void TestInActiveUser() {

        Profile p = [Select Id From Profile Where Name='System Administrator'];

        User TestUser = New User( Alias = 'Newuser', Email='Moo987@testFrozenUser.com', 
        LastName= 'Testme', Firstname= 'you', Languagelocalekey= 'en_US', 
        EmailEncodingKey= 'UTF-8', Status__c = 'Inactive', LocaleSidKey='en_US', 
        Profileid= P.id, TimeZoneSidkey='America/Los_Angeles',
        UserName= 'Moo987@testFrozenUser.com');
		
        List<User> lstUsr = new List <User>();                  
        Database.SaveResult userInsertResult= Database.insert(TestUser);
        lstUsr.add(TestUser);
        test.StartTest();
        testUser.IsActive =False;
        Update testuser;
        
	ID batchjobid = Database.executeBatch(new UserupdateBatch());
    
    test.StopTest();
     User assertUser = [Select Id, Username, Status__c From User Where id=:TestUser.id][0];

        System.assertEquals('Inactive', assertUser.Status__c);

 }
}

 

All Answers

Raj VakatiRaj Vakati
Use below code
 
global class UserUpdateBatch implements Database.Batchable<sObject> {

    Public String query;

    global Database.QueryLocator start(Database.BatchableContext BC) {
       //if(!Test.isRunningTest()){
        query = 'SELECT Id, isActive, Status__c FROM User LIMIT 200');
      //}  
        return Database.getQueryLocator(query);
    }

    global void execute(Database.BatchableContext BC, List<User> scope) {    
        List<Id> usrLogLst = new List<Id>();
        for(UserLogin ul : [SELECT UserId, isFrozen from UserLogin where isFrozen = true and UserId IN: scope]){
            usrLogLst.add(ul.userid);
        }
        
        for(User usr : scope){
            if(usrLogLst.contains(usr.id)){
                usr.status__c = 'Frozen';
            }
            else{
                if(usr.isActive==true){
                    usr.status__c = 'Active';
                }
                else{
                    usr.status__c = 'Inactive';
                }
            }
        }

        Database.SaveResult [] updateResult = Database.update(scope, false);
        
        for (Database.SaveResult r : updateResult)
        
        {
            if (!r.isSuccess()) 
            {
                for (Database.Error e : r.getErrors())
            { system.debug('Error'+e); }
            
            }
        
        }
               update scope;
    }

    global void finish(Database.BatchableContext BC) {
    }
}
 
@isTest
private class UserUpdateBatch_Test{
Public static TestMethod Void TestActiveUser() {
        Profile p = [Select Id From Profile Where Name='System Administrator'];

        User TestUser = New User( Alias = 'testuser', Email='Moo987@testFrozenUser.com',
         LastName= 'Testme', Firstname= 'you', Languagelocalekey= 'en_US', 
        LocaleSidKey='en_US', Status__c = 'Active', TimeZoneSidkey='America/Los_Angeles', ProfileId=p.id,
         UserName= 'Moo987@testFrozenUser.com', EmailEncodingKey= 'UTF-8');
        insert TestUser;

    test.StartTest();

		ID batchjobid = Database.executeBatch(new UserupdateBatch());
   
    test.StopTest(); 

        User assertUser= [select Id, Username, Status__c From User Where id=:TestUser.id][0];
     
        System.assertEquals('Active', assertUser.Status__c);
    
    }

Public Static TestMethod Void TestInActiveUser() {

        Profile p = [Select Id From Profile Where Name='System Administrator'];

        User TestUser = New User( Alias = 'Newuser', Email='Moo987@testFrozenUser.com', 
        LastName= 'Testme', Firstname= 'you', Languagelocalekey= 'en_US', 
        EmailEncodingKey= 'UTF-8', Status__c = 'Inactive', LocaleSidKey='en_US', 
        Profileid= P.id, TimeZoneSidkey='America/Los_Angeles',
        UserName= 'Moo987@testFrozenUser.com');
		
        List<User> lstUsr = new List <User>();                  
        Database.SaveResult userInsertResult= Database.insert(TestUser);
        lstUsr.add(TestUser);
        test.StartTest();
        testUser.IsActive =False;
        Update testuser;
        
	ID batchjobid = Database.executeBatch(new UserupdateBatch());
    
    test.StopTest();
     User assertUser = [Select Id, Username, Status__c From User Where id=:TestUser.id][0];

        System.assertEquals('Inactive', assertUser.Status__c);

 }
}

 
This was selected as the best answer
Ann rdyAnn rdy
Thank you for the rapid response Raj V.

It has covered 95% but the test has failed.
Is this

Error Message; System.DmlException: Update failed. First exception on row 0 with id 005U0000003XLP7IAO; first error: INSUFFICIENT_ACCESS_OR_READONLY, Cannot insert a user with this profile: []

This ID shows User as Automated Process