Я создал ниже пакетный класс вершины. Я также создал тестовый класс для этого. Но этот тестовый класс покрывает только 27% высшего класса партии. Кроме того, он не вызывает метод выполнения класса пакетной вершины.

Пакетный класс Apex:


global class LeadDuplicateRemove implements Database.Batchable < sObject > {


    global Database.QueryLocator start(Database.BatchableContext bc) {
        return Database.getQueryLocator('select Id, CreatedDate, Phone, Status, Email from Lead Where convertedbusiness__c != null and LeadAudit__c = null  and isDeleted = false order by CreatedDate ASC Limit 1');
    }

    global void execute(Database.BatchableContext bc, List < Lead > scope) {
        for (Lead lead: scope) {
            Database.QueryLocator leadQueryLocator = Database.getQueryLocator([Select Id, CreatedDate, Phone, Status, Email from Lead where convertedbusiness__c != null and LeadAudit__c = '1' and isDeleted = false order by CreatedDate ASC Limit 1]);

            Database.QueryLocatorIterator iterator = leadQueryLocator.iterator();
            while (iterator.hasNext()) {
                Lead leadObj = (Lead) iterator.next();

                if(lead.ConvertedBusiness__c == leadObj.ConvertedBusiness__c){
                    lead.ConvertedBusiness__c = null;
                }
            }
        } 
    }
    global void finish(Database.BatchableContext bc) {
    }
}

Тестовый класс:

@isTest global class LeadDuplicateRemoveTest {
    @testSetup 
    global static void setup() {

        Lead lead1 = new Lead(LastName='testlead1 ', RAF_Nurture_Campaign__c = 'None',
                              company='test', Email='testemai@email.com.invalid',Phone = '1111111111',Status ='Completed');

        insert lead1;
        insert new Lead(LastName='testlead1', RAF_Nurture_Campaign__c = 'None',
                               company='Vtest', Email='testemai@email.com.invalid',Phone = '222222',Status ='Open');

    }
    @isTest global static void TestRun() {         
        Test.startTest();
        Database.executeBatch(new LeadDuplicateRemove());
        Test.stopTest();

    }

}

enter image description here

0
salesforce-sas 17 Авг 2019 в 10:45

1 ответ

У вас есть фильтр convertedbusiness__c != null, но при создании интереса вы его не устанавливаете.

Lead lead1 = new Lead(convertedbusiness__c= ??, LastName='testlead1 ', RAF_Nurture_Campaign__c = 'None',
                          company='test', Email='testemai@email.com.invalid',Phone = '1111111111',Status ='Completed');

Поскольку из метода start не возвращаются никакие записи, он даже не вызывает метод execute.

Примечание.

Кроме того, у вас есть локатор запросов и итератор внутри выполнения, что не нужно. Вы возвращаете интересы, где LeadAudit__c = null, и снова обрабатываете записи, где LeadAudit__c = '1'. Вы также можете удалить фильтр LeadAudit__c = null из метода start и обрабатывать записи внутри выполнения без итератора.

3
salesforce-sas 17 Авг 2019 в 10:56
2
Кроме того, нет операции DML, поэтому изменения не будут сохраняться в методе выполнения.
 – 
sfdcfox
17 Авг 2019 в 11:07
+1. Причина, по которой итератор запросов к базе данных внутри метода выполнения заключается в том, что я сравниваю записи лидов leadautit__c = null, полученные в методах запуска, с записями лидов с leadaudit__c = '1'. Разве это не правильный способ сделать?
 – 
DRules
17 Авг 2019 в 20:43
Вы можете получить записи без фильтра аудита лидов. Внутри области выполнения метода вы получаете оба типа записей, которые вы можете сравнить. Нет необходимости в каком-либо запросе снова
 – 
salesforce-sas
17 Авг 2019 в 20:52
Но дело в том, что я хочу сравнить только те записи leadaudit = null с leadaudit = 1. Если я оставлю leadaudit = null в начале, то будут получены только те лиды в области действия. Так что я могу сравнить каждую из этих записей с записью leadauit = 1 в методе выполнения. Я делаю что-то неправильно здесь?
 – 
DRules
17 Авг 2019 в 22:17