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
Naveen Velkur 6Naveen Velkur 6 

How to write test class for the below trigger?

trigger CountContacts on Contact (after insert, after delete) {
List<Account> addAccCount= new List<Account>();
    Set<Id> addConId= new Set<Id>();
if(trigger.isInsert){
for(Contact con:trigger.new){
addConId.add(con.AccountId);
}
}
if(trigger.isDelete){
for(Contact con:trigger.old){
addConId.add(con.AccountId);
}
}
List<Account> accList=[SELECT Id,CountofContacts__c, (SELECT Id FROM Contacts) FROM Account WHERE Id in: addConId];
for(Account acc:accList){
acc.CountofContacts__c = acc.Contacts.size();
addAccCount.add(acc);
}
Update addAccCount;
}
if(trigger.isDelete){
for(Contact con:trigger.old){
addConId.add(con.AccountId);
}
}
List<Account> accList=[SELECT Id,CountofContacts__c, (SELECT Id FROM Contacts) FROM Account WHERE Id in: addConId];
for(Account acc:accList){
acc.CountofContacts__c = acc.Contacts.size();
addAccCount.add(acc);
}
Update addAccCount;
}
Best Answer chosen by Naveen Velkur 6
Prateek Prasoon 25Prateek Prasoon 25
@isTest
private class CountContactsTest {
    static testMethod void testCountContacts() {
        // create test accounts
        List<Account> accounts = new List<Account>();
        for(Integer i = 0; i < 2; i++) {
            accounts.add(new Account(Name = 'Test Account ' + i));
        }
        insert accounts;
        // create test contacts
        List<Contact> contacts = new List<Contact>();
        for(Integer i = 0; i < 4; i++) {
            contacts.add(new Contact(FirstName = 'Test', LastName = 'Contact ' + i, AccountId = accounts[i/2].Id));
        }
        insert contacts;
        // test trigger on insert
        Test.startTest();
        insert new Contact(FirstName = 'Test', LastName = 'New Contact', AccountId = accounts[0].Id);
        Test.stopTest();
        List<Account> updatedAccounts = [SELECT Id, CountofContacts__c FROM Account WHERE Id IN :accounts];
        System.assertEquals(2, updatedAccounts.size());
        System.assertEquals(2, updatedAccounts[0].CountofContacts__c);
        System.assertEquals(2, updatedAccounts[1].CountofContacts__c);
        // test trigger on delete
        Test.startTest();
        delete [SELECT Id FROM Contact WHERE AccountId = :accounts[0].Id];
        Test.stopTest();
        updatedAccounts = [SELECT Id, CountofContacts__c FROM Account WHERE Id IN :accounts];
        System.assertEquals(2, updatedAccounts.size());
        System.assertEquals(0, updatedAccounts[0].CountofContacts__c);
        System.assertEquals(2, updatedAccounts[1].CountofContacts__c);
    }

If you find this answer helpful, Please mark it as the best answer.

All Answers

Prateek Prasoon 25Prateek Prasoon 25
@isTest
private class CountContactsTest {
    static testMethod void testCountContacts() {
        // create test accounts
        List<Account> accounts = new List<Account>();
        for(Integer i = 0; i < 2; i++) {
            accounts.add(new Account(Name = 'Test Account ' + i));
        }
        insert accounts;
        // create test contacts
        List<Contact> contacts = new List<Contact>();
        for(Integer i = 0; i < 4; i++) {
            contacts.add(new Contact(FirstName = 'Test', LastName = 'Contact ' + i, AccountId = accounts[i/2].Id));
        }
        insert contacts;
        // test trigger on insert
        Test.startTest();
        insert new Contact(FirstName = 'Test', LastName = 'New Contact', AccountId = accounts[0].Id);
        Test.stopTest();
        List<Account> updatedAccounts = [SELECT Id, CountofContacts__c FROM Account WHERE Id IN :accounts];
        System.assertEquals(2, updatedAccounts.size());
        System.assertEquals(2, updatedAccounts[0].CountofContacts__c);
        System.assertEquals(2, updatedAccounts[1].CountofContacts__c);
        // test trigger on delete
        Test.startTest();
        delete [SELECT Id FROM Contact WHERE AccountId = :accounts[0].Id];
        Test.stopTest();
        updatedAccounts = [SELECT Id, CountofContacts__c FROM Account WHERE Id IN :accounts];
        System.assertEquals(2, updatedAccounts.size());
        System.assertEquals(0, updatedAccounts[0].CountofContacts__c);
        System.assertEquals(2, updatedAccounts[1].CountofContacts__c);
    }

If you find this answer helpful, Please mark it as the best answer.
This was selected as the best answer
Arun Kumar 1141Arun Kumar 1141
Hi Naveen,

1. Trigger Class
trigger CountContacts on Contact (after insert, after delete) {
    if (Trigger.isInsert) { 
        CountContactsHandler.handleContacts(Trigger.new);
    } 
    if (Trigger.isDelete) {   
        CountContactsHandler.handleContacts(Trigger.old);
    }  
}
2. Handler Class
public class CountContactsHandler {
    public static void handleContacts(List<Contact> conList) {
        try{ 
            Set<Id> accountIds = new Set<Id>(); 
            for (Contact con : conList) {   
                accountIds.add(con.AccountId);
            }
            List<Account> accList = [SELECT Id, CountofContacts__c, (SELECT Id FROM Contacts) FROM Account WHERE Id IN :accountIds];
            for (Account acc : accList) {
                acc.CountofContacts__c = acc.Contacts.size();
            } 
            update accList;
        } 
        catch (Exception e) {
            System.debug('Exception occurred in handleContacts: ' + e.getMessage());
        }
    }
}

3. Test Class
@isTest public class CountContactsHandlerTest {
    @isTest static void testHandleContacts() {
        List<Account> accList = new List<Account>();
        for (Integer i = 0; i < 2; i++) {
            Account acc = new Account(Name = 'Test Account ' + i); 
            accList.add(acc);
        }
        insert accList;
        List<Contact> conList = new List<Contact>();
        for (Integer i = 0; i < 2; i++) {
            Contact con = new Contact(FirstName = 'Test', LastName = 'Contact ' + i, AccountId = accList[i].Id);
            conList.add(con); 
        }
        insert conList;
        List<Account> updatedAccList = [SELECT Id, CountofContacts__c FROM Account WHERE Id IN :accList];
        for (Account acc : updatedAccList) {
            System.assertEquals(1, acc.CountofContacts__c);
        }
        delete conList;
        
        updatedAccList = [SELECT Id, CountofContacts__c FROM Account WHERE Id IN :accList];
        for (Account acc : updatedAccList) {
            System.assertEquals(0, acc.CountofContacts__c);
        }
    }
}
Hope this will help.
Thanks!