0

恐れ入りますが、別のテストに引っかかっています。一括 APEX クラスの単体テストを作成しようとしています。

クラスには Google API へのコールアウトがあるため、モックを介してフィードする静的リソースを作成したので、返された JSON の処理のテストを完了することができます。ただし、何らかの理由で、応答は常に空です。

非常に奇妙なことは、以前の @future 呼び出しでまったく同じコールアウト/JSON コードと同じモック コードを使用すると、正常に返されることです。

クラスは次のとおりです。

global class mileage_bulk implements Database.Batchable<sObject>,
  Database.AllowsCallouts
{
global Database.QueryLocator start(Database.BatchableContext BC)
{
String query = 'SELECT Id,Name,Amount,R2_Job_Ref__c,R2_Shipping_Post_Code__c,Shipping_Postcode_2__c FROM Opportunity WHERE R2_Shipping_Post_Code__c != null';
return Database.getQueryLocator(query);
//system.debug('Executing'+query);
}

global void execute(Database.BatchableContext BC, List<Opportunity> scope)
{
system.debug(scope);
for(Opportunity a : scope)
{

    String startPostcode = null;
    startPostcode = EncodingUtil.urlEncode('HP27DU', 'UTF-8');
    String endPostcode = null;
    String endPostcodeEncoded = null;
    if (a.R2_Shipping_Post_Code__c != null){
    endPostcode =   a.R2_Shipping_Post_Code__c;
    Pattern nonWordChar = Pattern.compile('[^\\w]');
    endPostcode = nonWordChar.matcher(endPostcode).replaceAll('');
    endPostcodeEncoded =   EncodingUtil.urlEncode(endPostcode, 'UTF-8');
        }   
    Double totalDistanceMeter = null;
    Integer totalDistanceMile = null;
   String responseBody = null;
   Boolean firstRecord = false;

    String ukPrefix = 'UKH';
    if (a.R2_Job_Ref__c != null){    
    if ((a.R2_Job_Ref__c).toLowerCase().contains(ukPrefix.toLowerCase())){
    system.debug('Is Hemel Job');
    startPostcode = EncodingUtil.urlEncode('HP27DU', 'UTF-8');
    } else {
    system.debug('Is Bromsgrove Job');
    startPostcode = EncodingUtil.urlEncode('B604AD', 'UTF-8');
    }
    }

    // build callout
    Http h = new Http();
    HttpRequest req = new HttpRequest();
    req.setEndpoint('http://maps.googleapis.com/maps/api/directions/json?origin='+startPostcode+'&destination='+endPostcodeEncoded+'&units=imperial&sensor=false');
    req.setMethod('GET');
    req.setTimeout(60000);
    system.debug('request follows');
    system.debug(req);

try{  
        // callout
        HttpResponse res = h.send(req);

        // parse coordinates from response

        JSONParser parser = JSON.createParser(res.getBody());

        responseBody = res.getBody();
        system.debug(responseBody);

        while (parser.nextToken() != null) {
            if ((parser.getCurrentToken() == JSONToken.FIELD_NAME) && 
                (parser.getText() == 'distance')){
                   parser.nextToken(); // object start
                   while (parser.nextToken() != JSONToken.END_OBJECT){
                       String txt = parser.getText();
                       parser.nextToken();
                       //system.debug(parser.nextToken());
                       //system.debug(txt);
                       if (firstRecord == false){
                       //if (txt == 'text'){
                           //totalDistanceMile = parser.getText();
                           system.debug(parser.getText());
                       //}
                       if (txt == 'value'){
                           totalDistanceMeter = parser.getDoubleValue();
                           double inches = totalDistanceMeter*39.3701;
                           totalDistanceMile = (integer)inches/63360;
                           system.debug(parser.getText());
                           firstRecord = true;
                       }
                       }
                   }

            }
        }


    } catch (Exception e) {
    }

//system.debug(accountId);
    system.debug(a);
    system.debug(endPostcodeEncoded);
    system.debug(totalDistanceMeter);
    system.debug(totalDistanceMile);

        // update coordinates if we get back 
        if (totalDistanceMile != null){
        system.debug('Entering Function to Update Object');
            a.DistanceM__c = totalDistanceMile;
            a.Shipping_Postcode_2__c = a.R2_Shipping_Post_Code__c;
            //update a;        
        }  
}
update scope;
}


global void finish(Database.BatchableContext BC)
{
}
}

これがテストクラスです。

@isTest
private class mileage_bulk_tests{

static testMethod void myUnitTest() {
     Opportunity opp1 = new Opportunity(name = 'Google Test Opportunity',R2_Job_Ref__c = 'UKH12345',R2_Shipping_Post_Code__c = 'AL35QW',StageName = 'qualified',CloseDate = Date.today());
 insert opp1;
 Opportunity opp2 = new Opportunity(name = 'Google Test Opportunity 2',StageName = 'qualified',CloseDate = Date.today());
 insert opp2;
 Opportunity opp3 = new Opportunity(name = 'Google Test Opportunity 3',R2_Job_Ref__c = 'UKB56789',R2_Shipping_Post_Code__c = 'AL35QW',StageName = 'qualified',CloseDate = Date.today());
insert opp3;


StaticResourceCalloutMock mock = new StaticResourceCalloutMock();
mock.setStaticResource('googleMapsJSON');
mock.setStatusCode(200); // Or other appropriate HTTP status code
mock.setHeader('Content-Type', 'application/json'); // Or other appropriate MIME type like application/xml

//Set the mock callout mode
Test.setMock(HttpCalloutMock.class, mock);

system.debug(opp1);
system.debug(opp1.id);

//Call the method that performs the callout
Test.startTest();
mileage_bulk b = new mileage_bulk();
database.executeBatch((b), 10);
Test.stopTest();
    }
}

大変助かります!

ありがとう

ガレス

4

1 に答える 1

2
  1. 「googleMapsJSON」がどのように見えるかわからないので、投稿していただけないでしょうか。
  2. モック リソースが適切にフォーマットされていると仮定すると、ファイル拡張子が ".json" であり、UTF-8 エンコーディングで保存されていることを確認してください。

    #2が機能しない場合は、リソースを.txtとして保存してみてください.プレーンテキストリソースが必要であるが、アプリケーション/ jsonコンテンツタイプが予想される前に、これに遭遇しました.

  3. 指定するリソース名の文字列は、リソースの名前と大文字と小文字が同じであることを確認してください。大文字と小文字が区別されます。

  4. 名前空間付きパッケージ環境で開発していますか? その場合は、名前空間をリソース名に追加してみてください。

それ以外の場合、コードは一見するとかなりよく見えます。

于 2013-09-14T07:19:08.183 に答える