0

ケースエスカレーション用のバッチapexクラスを作成しました。そのための Test クラスを書きたいと思います。誰か助けてください。以下は私が書いたコードです:

global class CaseEscalation  implements  Database.Batchable<SObject> 

{

global CaseEscalation()

{

}  

 global Database.QueryLocator start(Database.BatchableContext  ctx)

 {

  System.debug('checking=======');

     return Database.getQueryLocator([SELECT  CaseNumber, CreatedDate,Status FROM Case             where (Status!='Closed' AND Status!='Escalated') and CreatedDate<TODAY ]); 

 }


 global void execute(Database.BatchableContext ctx, List<Sobject> scope)

 {

   List<Case> ca = (List<Case>)scope;

   System.debug('checking======='+ca);

   for(Case c : ca)

   {      

             System.Debug(c);
             String emailMessage = 'The case  ' + c.CaseNumber + ' has been ecalated ' + ' Please look into the case ' + 'Thankyou';

             Messaging.SingleEmailMessage mail  =   new Messaging.SingleEmailMessage();

             String[] toAddresses = new String[] {'reems.agarwal3@gmail.com'};

             mail.setToAddresses(toAddresses);

             mail.setSubject('Case Escalation');

             mail.setPlainTextBody(emailMessage);

             Messaging.sendEmail(new Messaging.SingleEmailMessage[]{ mail });

             c.Status = 'Escalated';

    }

    if(ca.size()>0)

    update ca;

       }

global void finish(Database.BatchableContext ctx)

{

}


}
4

1 に答える 1

0

現在のコードを使用してバッチを簡単にテストすることはできません。これは、テスト データを作成すると、今日の作成日で作成されるため、クエリ ロケーターがレコードを返さず、execute メソッドが実行されないためです。

バッチを実行できるように微調整しました。

global class CaseEscalation implements Database.Batchable<SObject> {

    private static Date cutOff;

    global CaseEscalation(Date CutOffDate){
        cutOff = CutOffDate;
    }  

    global Database.QueryLocator start(Database.BatchableContext  ctx){
        return Database.getQueryLocator('SELECT Id, CaseNumber, CreatedDate, Status FROM Case WHERE (Status != \'Closed\' AND Status != \'Escalated\') and CreatedDate < :cutOff '); 
    }

    global void execute(Database.BatchableContext ctx, List<Sobject> scope){

        if(scope.size() == 0)
            return;

        for(Case c : (List<Case>)scope){      
            String emailMessage = 'The case  ' + c.CaseNumber + ' has been ecalated ' + ' Please look into the case ' + 'Thankyou';
            Messaging.SingleEmailMessage mail  =   new Messaging.SingleEmailMessage();
            String[] toAddresses = new String[] {'reems.agarwal3@gmail.com'};
            mail.setToAddresses(toAddresses);
            mail.setSubject('Case Escalation');
            mail.setPlainTextBody(emailMessage);
            Messaging.sendEmail(new Messaging.SingleEmailMessage[]{ mail });

            c.Status = 'Escalated';
        }

        update scope;
    }

    global void finish(Database.BatchableContext ctx){

    }
}

これを取得したら、いくつかのテストを作成して、それが実行されることを証明できます。バッチ実行メソッド内から一度に 10 件を超える電子メールを送信できないことに注意する必要があるため、バッチを実行するときは必ずスコープ パラメーターを実行メソッドに渡す必要があります。execute メソッドのループ内で電子メールの本文を単純に作成し、更新されたレコードのすべての詳細を含む 1 つの電子メールを送信したいと思います。知事の限界に達する心配。元のコードにできるだけ近づけたかったので、これは行っていません。

次に、このようなテスト スクリプトを記述して、コードを実行できます。

@isTest
private class CaseEscalationTest {

    private static testMethod void testInCutOff(){

        List<Case> testCases = new List<Case>();

        for(Integer i = 0; i < 10; i++)
            testCases.add(new Case(Status='Open'));

        insert testCases;

        Test.startTest();

        CaseEscalation ce = new CaseEscalation(system.today().addDays(1));
        database.executeBatch(ce, 10);

        Test.stopTest();

        testCases = [SELECT Id FROM Case WHERE Status = 'Open'];

        system.assertEquals(0, testCases.size());

    }

    private static testMethod void testOUtOfCutOff(){

        List<Case> testCases = new List<Case>();

        for(Integer i = 0; i < 10; i++)
            testCases.add(new Case(Status='Open'));

        insert testCases;

        Test.startTest();

        CaseEscalation ce = new CaseEscalation(system.today());
        database.executeBatch(ce, 10);

        Test.stopTest();

        testCases = [SELECT Id FROM Case WHERE Status = 'Open'];

        system.assertEquals(10, testCases.size());

    }

}

テストで注意すべきことは の使用です。これによりTest.startTest()Test.stopTest()テストを続行する前にバッチが強制的に実行されるため、データベースから更新されたデータを選択して、期待どおりに変更されていることを確認できます。前に述べたように、「database.executeBatch()」メソッドには、スコープ内のレコード数を制限するために 2 番目のパラメーターを渡す必要があります。これは、execute メソッドの構造を変更することで削除できます。他に注意すべき点は、バッチをテストするために複数のレコードを作成することをお勧めしますが、テストから呼び出すことができる実行メソッドは 1 つだけであるため、複数の「スコープ」の価値を作成しないことを忘れないでください。

于 2012-06-12T19:01:38.970 に答える