2016-12-10 4 views
0

In einer Spring-Boot-Anwendung, ich einige Anrufe zu Moneris. Ich würde gerne diesen Teil verspotten.Nicht in der Lage, korrekt zu spielen

In einer Serviceklasse:

@Transactional 
@Override 
public void saveCreditCard(CreditCardInfoDto creditCardInfo) throws CreditCardException, ResourceNotFoundException { 
    ... 
    ResolveData resdata = null; 
    ResolverReceipt resreceipt = null; 
    ... 
    ResAddCC resAddCC = new ResAddCC(creditCardInfo.getCreditCard(), expirationDate, String.valueOf(paymentGateway.getCryptType())); 
    resAddCC.setCustId(member.getMemberId().toString()); 


    ResolverHttpsPostRequest mpgReq = new ResolverHttpsPostRequest(paymentGateway.getHost(), paymentGateway.getStoreId(), paymentGateway.getApiToken(), resAddCC); 
    resreceipt = mpgReq.getResolverReceipt(); 
    resdata = resreceipt.getResolveData(); 

       ... 
    if (resreceipt != null && resreceipt.getResponseCode() != null && Integer.getInteger(resreceipt.getResponseCode()) < 50) { 
        ... 

    } 

Wenn ich debuggen, ich sehe dann resreceipt nicht null, die gleiche Sache mit resreceipt.getResponseCode ist(), aber das auf dieser Linie un Null-Zeiger-Ausnahme tun.

Realer Wert vs Mock?

Es scheint, dass irrealer Anruf zu Moneris getan wird ... Ich möchte das vermeiden.

In meiner Klasse Test habe ich:

@InjectMocks 
PaymentServiceImpl paymentService; 

@Mock 
MemberRepository memberRepository; 

@Mock 
PaymentGatewayConfigRepository paymentGatewayConfigRepository; 

@Mock 
OperationRepository operationRepository; 

@Mock 
ResolverReceipt resreceipt; 

@Mock 
ResolverHttpsPostRequest mpgReq; 

@Before 
public void initMocks() { 
    MockitoAnnotations.initMocks(this); 
} 

Mockito.when(memberRepository.findOne(memberId)).thenReturn(member); 

    Mockito.when(paymentGatewayConfigRepository.findAll()).thenReturn(paymentsGateway); 

    ResolverReceipt resreceipt = new ResolverReceipt("<?xml version=\"1.0\" encoding=\"UTF-8\"?> <receipt> <DataKey>iZxTfRWZaRd3S2lajvoZaPA22</DataKey> <ReceiptId>null</ReceiptId> <ReferenceNum>null</ReferenceNum> <ResponseCode>001</ResponseCode> <ISO>null</ISO> <AuthCode>null</AuthCode> <Message>Successfully registered CC details.</Message> <TransTime>19:13:52</TransTime> <TransDate>2016-12-09</TransDate> <TransType>null</TransType> <Complete>true</Complete> <TransAmount>null</TransAmount> <CardType>null</CardType> <TransID>null</TransID> <TimedOut>false</TimedOut> <CorporateCard>null</CorporateCard> <RecurSuccess>null</RecurSuccess> <AvsResultCode>null</AvsResultCode> <CvdResultCode>null</CvdResultCode> <ResSuccess>true</ResSuccess> <PaymentType>cc</PaymentType> <IsVisaDebit>null</IsVisaDebit> <ResolveData>  <cust_id>1</cust_id>  <phone>4506777244</phone>  <email>[email protected]</email>  <note></note>  <crypt_type>0</crypt_type>  <masked_pan>4242***4242</masked_pan>  <expdate>1601</expdate> </ResolveData> </receipt> "); 


    Mockito.when(mpgReq.getResolverReceipt()).thenReturn(resreceipt); 

Antwort

0

Grundsätzlich benötigen Sie einen seam in Ihrem Code erstellen, in dem Sie das Verhalten des Codes ändern können, ohne den Code zu ändern, selbst. Im Wesentlichen injizieren Sie Abhängigkeiten, anstatt dass der Code Abhängigkeiten instanziert, sodass Abhängigkeiten beim Testen gespiegelt werden können. Derzeit müssen Sie in Ihrem Testcode den tatsächlichen Wert resAddCC und mpgReq verwenden, da der aktuelle Produktionscode sie über das Schlüsselwort new instanziiert, anstatt eine injizierte Factory zu verwenden und dann die Factory-Methode für das Factory-Objekt aufzurufen. Mit einer solchen Fabrik könnte man die Fabrik und ihren Ruf verspotten, wo sie sonst Moneris anrufen würde.

Verwandte Themen