You need to sign in to do that
Don't have an account?
Ann 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);
}
}
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);
}
}
All Answers
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