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
Jan AertgeertsJan Aertgeerts 

Need help writing test class for global class with own types

Hi 

I'm currently stuck writing a test class for the following code:
 
global class CreateRecurringInvoice {
  @InvocableMethod(label='Create Recurring Invoice')
  global static List<CreateRecurringInvoiceResult> createInvoices(List<CreateRecurringInvoiceRequest> requests) {
    List<CreateRecurringInvoiceResult> results = new List<CreateRecurringInvoiceResult>();
    for (CreateRecurringInvoiceRequest request : requests) {
      results.add(createInvoices(request));
    }
    return results;
  }

  public static CreateRecurringInvoiceResult createInvoices(CreateRecurringInvoiceRequest request) {
      Factuur__c nieuweFactuur = new Factuur__c();
      Factuur__c oudeFactuur;
      Factuurlijn__c factuurlijn;

      
        List<String> factuurlijnFields = new List<String> (Factuurlijn__c.SObjectType.getDescribe().fields.getMap().keySet());
      
        List<String> factuurFields = new List<String> (Factuur__c.SObjectType.getDescribe().fields.getMap().keySet());
        String soqlParent = '' + 'select ' + String.join(factuurFields, ',') + ', (SELECT ' + String.join(factuurlijnFields, ',') + ' FROM Factuurlijnen__r) from Factuur__c' + ' where id = \'' + request.oldInvoiceId + '\'';
        for (Factuur__c obj: Database.query(soqlParent)) {
            oudeFactuur = obj;
        }

      nieuweFactuur.Name = oudeFactuur.Name;
      nieuweFactuur.Klant__c = oudeFactuur.Klant__c;
      nieuweFactuur.Datum__c = date.today();
      nieuweFactuur.Herhalingstermijn__c = oudeFactuur.Herhalingstermijn__c;
      nieuweFactuur.Recurrente_factuur__c = oudeFactuur.Recurrente_factuur__c;
      nieuweFactuur.Info__c = oudeFactuur.Info__c;
      nieuweFactuur.Referentie__c = oudeFactuur.Referentie__c;
      nieuweFactuur.Project__c = oudeFactuur.Project__c;
      nieuweFactuur.Betalingstermijn__c = oudeFactuur.Betalingstermijn__c;

      insert nieuweFactuur;
      
      String soqlChild = '' + 'select ' + String.join(factuurlijnFields, ',') + ' from Factuurlijn__c' + ' where Factuur__c = \'' + request.oldInvoiceId + '\'';
        for (Factuurlijn__c obj: Database.query(soqlChild)) {
            Factuurlijn__c nieuweFactuurlijn = new Factuurlijn__c();
            nieuweFactuurlijn.Name = obj.Name;
            nieuweFactuurlijn.Factuur__c = nieuweFactuur.Id;
            nieuweFactuurlijn.Aantal__c = obj.Aantal__c;
            nieuweFactuurlijn.Bedrag__c = obj.Bedrag__c;
            nieuweFactuurlijn.BTW__c = obj.BTW__c;
            nieuweFactuurlijn.Info__c = obj.Info__c;
            insert nieuweFactuurlijn;
        }
      
      CreateRecurringInvoiceResult result = new CreateRecurringInvoiceResult();
      return result;
  }

  global class CreateRecurringInvoiceRequest {
    @InvocableVariable(required=true)
    public ID oldInvoiceId;
  }

  global class CreateRecurringInvoiceResult {
    @InvocableVariable
    public ID newInvoiceId;
  }
}

My current test class is like this, but it has 0/0:
@isTest
Private class CreateRecurringInvoiceTest {
    Static testMethod void myUnitTest() {
        Test.StartTest();
        CreateRecurringInvoice cri = new CreateRecurringInvoice();
        CreateRecurringInvoice.CreateRecurringInvoiceRequest request = new CreateRecurringInvoice.CreateRecurringInvoiceRequest();
        CreateRecurringInvoice.CreateRecurringInvoiceResult result = new CreateRecurringInvoice.CreateRecurringInvoiceResult();
        Account acc = new Account(Name = 'Test');
        insert acc;
        Factuur__c oldfact = new Factuur__c(Name = 'Test', Klant__c = acc.Id, Datum__c = date.today());
        insert oldfact;
        request.oldInvoiceId = oldfact.Id;
        Factuur__c newfact = new Factuur__c(Name = 'Test', Klant__c = acc.Id, Datum__c = date.today());
        insert newfact;
        result.newInvoiceId = newfact.Id;
        List<CreateRecurringInvoice.CreateRecurringInvoiceResult> results = new List<CreateRecurringInvoice.CreateRecurringInvoiceResult>();
        List<CreateRecurringInvoice.CreateRecurringInvoiceRequest> requests = new List<CreateRecurringInvoice.CreateRecurringInvoiceRequest>();
        
        
        Test.StopTest();
    }
}

Can someone help me on the way?

Thanks in advance.

Kind regards
Best Answer chosen by Jan Aertgeerts
Jan AertgeertsJan Aertgeerts
Hi Mohit

Thanks for your reply.
Since it's a static method, I changed your line to:
CreateRecurringInvoice.createInvoices(request);

which did the trick of covering 63%.

Thanks

All Answers

Mohit Bansal6Mohit Bansal6
Hi Jan

After line 15, just add below code, 

cri.createInvoices(request);

Kindly try and share, if it works for you.

Regards
Mohit Bansal 
Jan AertgeertsJan Aertgeerts
Hi Mohit

Thanks for your reply.
Since it's a static method, I changed your line to:
CreateRecurringInvoice.createInvoices(request);

which did the trick of covering 63%.

Thanks
This was selected as the best answer