You need to sign in to do that
Don't have an account?
Perspectiva Negócios Digitais
HELP!- Test Apex Send Mail in a batch class!
Hi i'm lost in a test for a send email, i need to test if the email as sent, how i do that?
Thanks for your attention
Batch Class:
Thanks for your attention
Batch Class:
global class EmailCaringSenior implements Schedulable, Database.Batchable<sObject> { Account estipulante; global Database.QueryLocator start(Database.BatchableContext BC) { try{ estipulante = [SELECT Id FROM Account WHERE RecordTypeId IN (SELECT Id FROM RecordType WHERE Name = 'Estipulante' AND SObjectType = 'Account') AND Name = 'Caring Senior']; } catch(Exception e) { System.debug('The following exception has occurred: ' + e.getMessage()); } return Database.getQueryLocator([SELECT Name, CPF__pc FROM Account WHERE Estipulante__c = :estipulante.Id AND CreatedDate = TODAY]); } global void execute(Database.BatchableContext BC, List<sObject> scope) { List<Account> accounts = (List<Account>) scope; String listaPaciente = ''; Integer contagem = 0; for(Account paciente : accounts){ contagem++; listaPaciente += contagem + '. ' + paciente.Name + ' (CPF: ' + paciente.CPF__pc + ') <br>'; } String dataOntem = DateTime.now().addDays(-1).format('dd-MM-yyyy'); Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage(); message.toAddresses = new String[] { 'gabrielmocelin@unochapeco.edu.br' }; message.subject = 'Ace - Novos Pacientes (' + dataOntem + ')'; message.setHtmlBody('Olá Gestor, <br> Abaixo uma lista de pacientes carregados no Health Cloud ontem (' + dataOntem + '): <br><br> ' + listaPaciente); for(OrgWideEmailAddress owa : [SELECT Id, Address, DisplayName FROM OrgWideEmailAddress]) { if(owa.DisplayName.contains('Caring Senior')) { message.setOrgWideEmailAddressId(owa.Id); } } Messaging.SingleEmailMessage[] messages = new List<Messaging.SingleEmailMessage> {message}; Messaging.SendEmailResult[] results = Messaging.sendEmail(messages); if (results[0].success) { System.debug('The email was sent successfully.'); } else { System.debug('The email failed to send: ' + results[0].errors[0].message); } } global void execute(SchedulableContext sc) { EmailCaringSenior b = new EmailCaringSenior(); Database.executebatch(b); } global void finish(Database.BatchableContext BC) { } }Test Class:
@isTest public class Test_EmailCaringSenior { static testMethod void testInsertDetecta() { Integer contasAntes = [SELECT COUNT() FROM Account]; System.assertEquals(contasAntes, 0); RecordType estipulanteRecordType = [SELECT Id FROM RecordType WHERE Name = 'Estipulante' AND SObjectType = 'Account']; Account estipulante = new Account(); estipulante.RecordTypeId = estipulanteRecordType.Id; estipulante.Name = 'Caring Senior'; insert estipulante; Datetime dataAnteOntem = Datetime.now().addDays(-2); Test.setCreatedDate(estipulante.Id, dataAnteOntem); RecordType personAccountRecordType = [SELECT Id FROM RecordType WHERE Name = 'Paciente' AND SObjectType = 'Account']; Account paciente = new Account(); paciente.RecordType = personAccountRecordType; paciente.FirstName = 'Teste'; paciente.LastName = 'Sobrenome'; paciente.CPF__pc = '133.173.513-06'; paciente.Estipulante__c = estipulante.id; insert paciente; Datetime dataOntem = Datetime.now().addDays(-1); Test.setCreatedDate(paciente.Id, dataOntem); Test.startTest(); Account myAccount = [SELECT Id, Name, CreatedDate FROM Account WHERE Name ='Teste Sobrenome' LIMIT 1]; System.assertEquals(myAccount.CreatedDate, dataOntem); Account estipulanteTest = [SELECT Id, CreatedDate FROM Account WHERE Name = 'Caring Senior' AND RecordTypeId = :estipulanteRecordType.Id]; System.assertEquals(estipulanteTest.Id, estipulante.id); System.assertEquals(estipulanteTest.CreatedDate, dataAnteOntem); EmailCaringSenior b = new EmailCaringSenior(); Database.executebatch(b); Test.stopTest(); } }
Using the above kind of test you can achieve this. As @Max H. Goldfarb suggestion it's better to move to send mail part in the finish method of a Batch since that's the recommended way.
For the future, if possible - keep your letters in the final context of group classes, while large variables must be stored globally. SendEmailResult Class will be useful also, I just trying trial email sending here https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_email_outbound_sendemailresult.htm for the site https://rocketpayz.com/slots-paypal/free-casino-slots/.
As @Hariprasath said you can sing the above kind of test. This will solve the problem.