Pouvons-nous avoir deux appels Http Mock dans une seule méthode de classe de test
Dans ma méthode, faire deux appels en une seule transaction
- Obtenir le jeton d'accès pour cette API -> GetAccessToken
- Exécuter le paiement
Lorsque j'ai exécuté la classe de test, j'ai reçu l'erreur suivante 08:50:00:839 FATAL_ERROR System.NullPointerException: Argument 2 cannot be null
. dans ce code request.setHeader('Authorization', accessTokenValue);
Dans ma réponse de maquette, je paramètre Uniquement sur Exécuter le paiement, Pouvons-nous nous moquer de l'API Access Token dans la même méthode. Depuis la execute Payment
réponse de la classe fictive uniquement, impossible d'effectuer l'appel de jeton d'accès, il accessTokenValue
est donc défini sur NULL.
Existe-t-il un moyen d'avoir plusieurs simulations dans une seule méthode de classe de test. Guidez-moi à ce sujet. Merci
Méthode:
@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;
}
}
Méthode d'essai
@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();
}
Réponse fictive :
@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;
}
}
Réponses
Oui, vous pouvez, en utilisant l'une des deux techniques.
Votre méthode peut inspecter son entrée et construire une réponse différenteHttpCalloutMock
en fonction du point de terminaison appelé, des paramètres passés, etc. Cela vous permet d'écrire une seule classe qui renvoie des réponses pour plusieurs appels effectués en séquence dans votre code sous test .respond()
HttpRequest
Alternativement, vous pouvez choisir d'utiliser la MultiStaticResourceCalloutMockclasse. Cette classe vous permet de stocker des corps de réponse dans des ressources statiques au sein de votre application et de configurer le Mock pour plusieurs points de terminaison en appelant setStaticResource()
une fois par point de terminaison auquel vous souhaitez que le Mock réponde. Cela peut vous éviter d'écrire du code passe-partout, si cela ne vous dérange pas de stocker vos réponses dans des ressources statiques plutôt que de les construire dans du code.