क्या हम एक एकल परीक्षण वर्ग विधि में दो Http मॉक कॉलआउट कर सकते हैं

Aug 17 2020

एक विधि में दो कॉलआउट बनाने वाली मेरी विधि में

  1. उस API के लिए एक्सेस टोकन प्राप्त करें -> GetAccessToken
  2. भुगतान निष्पादित करें

जब मैं निम्नलिखित त्रुटि प्राप्त परीक्षण वर्ग भागा 08:50:00:839 FATAL_ERROR System.NullPointerException: Argument 2 cannot be null। इस कोड में request.setHeader('Authorization', accessTokenValue);

मेरे मॉकअप रिस्पॉन्स में मैं केवल एक्ज़िक्यूट पेमेंट पर सेट कर रहा हूं, क्या हम एक्सेस टोकन एपीआई को समान विधि में मॉक कर सकते हैं। चूंकि मॉक क्लास केवल execute Paymentप्रतिक्रिया देता है, इसलिए एक्सेस टोकन कॉल करने में सक्षम नहीं है, इसलिए accessTokenValueइसे NULL के रूप में सेट किया गया है।

क्या कोई तरीका है कि हम एक एकल टेस्ट क्लास पद्धति में कई मॉक कर सकते हैं। इस पर मेरा मार्गदर्शन करें। जी शुक्रिया

तरीका:

 @AuraEnabled 
    public static boolean executepaymentbupayid(string payPalPayId , string payerid, Id familyrecId, string internalTransactionId){
        
        // string authorisation;
        string accessTokenValue;
        List<AggregateResult> aggr = [SELECT Service_Center__r.Client_ID__c,  Service_Center__r.Secret__c 
                                      ,Service_Center__r.PayPal_API__c
                                      FROM invoice__c WHERE   Student_Family__c=:familyrecId
                                      Group by Service_Center__r.Client_ID__c,  Service_Center__r.Secret__c, Service_Center__r.PayPal_API__c ];
        
        HttpResponse response = getPaypalAccessToken.GetAccessToken(String.valueOf(aggr[0].get('Client_ID__c')),String.valueOf(aggr[0].get('Secret__c')), String.valueOf(aggr[0].get('PayPal_API__c'))); 


        Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
        if (response.getStatusCode() == 200) {           
            System.debug('results' + results.get('access_token'));
            System.debug('results' + results.get('token_type'));
            string tokentype = String.valueof(results.get('token_type'));
            string accesstoken = String.valueof(results.get('access_token'));        
            accessTokenValue = tokentype + ' ' + accesstoken;
        }
        
   
        
        executePayment executePaymentWrapper = new executePayment(); 
        executePaymentWrapper.payerid = payerid;
        String myJSON = JSON.serialize(executePaymentWrapper);
        String jsonReplacedString;
        jsonReplacedString = myJSON.replace('payerid', 'payer_id');
        
        
        string endpoint;       
        endpoint = System.Label.PayPal_Live_Execute_Payment + payPalPayId + '/execute';
     
        
        http http = new http();
        httpRequest request = new httpRequest();
        request.setMethod('POST');
        request.setEndpoint(endpoint);
        request.setHeader('Content-Type', 'application/json');
        request.setHeader('Authorization', accessTokenValue);
        request.setBody(jsonReplacedString);
        httpResponse res = http.send(request);      
        if (Res.getStatusCode() == 200){
            boolean updatePaymentReceived = paymentReceivedUpdate(familyrecId, internalTransactionId);            
            If(updatePaymentReceived){
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }        
    }

जाँचने का तरीका

    @isTest
    public static void executepaymentbupayidTest(){
        Map <string,id> testData = TestDataFactory.CreateTestDate();  
        ID familyId = TestData.get('FamilyID');
        string payPalPayId ='PAYID-L43IDSI2C58062971907464F';
        string payerid ='SDV9S3QZQQPM4';
        string internalTransactionId = 'internalTransactionId';        
        test.startTest(); 
        Test.setMock(HttpCalloutMock.class, new ExecutepaymentbupayidMock()); 
        Boolean returnValue = Invoice.executepaymentbupayid(payPalPayId, payerid, familyId, internalTransactionId);
        test.stopTest();
    }

नकली प्रतिक्रिया:

@istest
public class ExecutepaymentbupayidMock implements HttpCalloutMock{
    
    public HTTPResponse respond(HTTPRequest request) {
        HttpResponse response = new HttpResponse();
        response.setHeader('Content-Type', 'application/json');
        response.setBody('{"id": "PAYID-L43IDSI2C58062971907464F","intent": "sale","state": "approved","cart": "8YT815237T955371T","payer": {"payment_method": "paypal","status": "VERIFIED","payer_info": {"email": "[email protected]","first_name": "Safari","last_name": "Individual","payer_id": "SDV9S3QZQQPM4","shipping_address": {"recipient_name": "Brian Robinson","line1": "4th Floor","line2": "Unit #34","city": "San Jose","state": "CA","postal_code": "95131","country_code": "US"},"phone": "4089285295","country_code": "US"}},"transactions": [{"amount": {"total": "95.00","currency": "USD","details": {"subtotal": "95.00","shipping": "0.00","insurance": "0.00","handling_fee": "0.00","shipping_discount": "0.00"}},"payee": {"merchant_id": "JKHMJ249QW9TU","email": "[email protected]"},"description": "Invoice Number - 0401","custom": "gE9SyW893fA2bMVDUwVosLpM1gKxqkx0%2B3MqYXpEDjM841djbcYnoN9%2BIgqgdass","invoice_number": "401","item_list": {"items": [{"name": "Invoice Number - 0401","description": "Session 2 (weeks of June 29-July 2 and July 6-9)","price": "95.00","currency": "USD","tax": "0.00","quantity": 1}],"shipping_address": {"recipient_name": "Brian Robinson","line1": "4th Floor","line2": "Unit #34","city": "San Jose","state": "CA","postal_code": "95131","country_code": "US"}},"related_resources": [{"sale": {"id": "2T59651963103743W","state": "completed","amount": {"total": "95.00","currency": "USD","details": {"subtotal": "95.00","shipping": "0.00","insurance": "0.00","handling_fee": "0.00","shipping_discount": "0.00"}},"payment_mode": "INSTANT_TRANSFER","protection_eligibility": "ELIGIBLE","protection_eligibility_type": "ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE","transaction_fee": {"value": "3.06","currency": "USD"},"parent_payment": "PAYID-L43IDSI2C58062971907464F","create_time": "2020-08-14T12:39:00Z","update_time": "2020-08-14T12:39:00Z","links": [{"href": "https://api.sandbox.paypal.com/v1/payments/sale/2T59651963103743W","rel": "self","method": "GET"},{"href": "https://api.sandbox.paypal.com/v1/payments/sale/2T59651963103743W/refund","rel": "refund","method": "POST"},{"href": "https://api.sandbox.paypal.com/v1/payments/payment/PAYID-L43IDSI2C58062971907464F","rel": "parent_payment","method": "GET"}]}}]}],"create_time": "2020-08-14T12:21:29Z","update_time": "2020-08-14T12:39:00Z","links": [{"href": "https://api.sandbox.paypal.com/v1/payments/payment/PAYID-L43IDSI2C58062971907464F","rel": "self","method": "GET"}]}');
        response.setStatusCode(201);
        return response; 
    }
}

जवाब

9 DavidReed Aug 17 2020 at 10:47

हां, आप दोनों तकनीकों में से किसी एक का उपयोग कर सकते हैं।

आपका HttpCalloutMockकी respond()विधि अपने भीतर का निरीक्षण कर सकते हैं HttpRequest, और एक का निर्माण विभिन्न जो endpoint बुलाया जा रहा है के आधार पर प्रतिक्रिया, मानकों को पारित कर दिया, आदि यह आप एक ही वर्ग में लिखने के लिए अनुमति देता है जो एक से अधिक परीक्षण के अंतर्गत अपने कोड में अनुक्रम में किए गए कॉल आउट के लिए रिटर्न की प्रतिक्रियाएं ।

वैकल्पिक रूप से, आप MultiStaticResourceCalloutMockकक्षा का उपयोग करना चुन सकते हैं । यह वर्ग आपको अपने अनुप्रयोग के भीतर स्टेटिक रिसोर्स में प्रतिक्रिया निकाय संग्रहीत करने की अनुमति देता है, और setStaticResource()एंडपॉइंट के लिए एक बार कॉल करके मॉक को कई एंडपॉइंट्स के लिए कॉन्फ़िगर करने के लिए, जिसमें आप मॉक को जवाब देना चाहते हैं। यह आपको कुछ बॉयलरप्लेट कोड लिखने से बचा सकता है, अगर आपको कोड में निर्माण करने के बजाय स्टेटिक रिसोर्सेस में अपनी प्रतिक्रियाओं को रखने में कोई आपत्ति नहीं है।