2016-12-10 86 views
0

在spring-boot應用程序中,我會對moneris進行一些調用。我想嘲笑這部分。無法正確模擬

在服務類:

@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) { 
        ... 

    } 

當我調試,我看到那麼resreceipt不爲空,同樣的事情resreceipt.getResponseCode(),但做這行取消空指針異常。

Real value vs Mock?

這似乎是不真實的呼叫是對moneris做的......我想避免這種情況。

在我的課測試我有:

@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); 

回答

0

基本上,你需要在你的代碼創建一個seam在那裏你可以改變代碼的行爲而無需修改代碼本身。從本質上講,你注入了依賴關係,而不是讓代碼實例化依賴關係,以便在測試時可以模擬依賴關係。目前,在測試代碼中,您不得不使用resAddCCmpgReq的實際值,因爲當前生產代碼通過關鍵字new實例化它們,而不是使用注入的工廠,然後在工廠對象上調用工廠方法。使用這樣一個工廠,你可以嘲笑工廠和它的電話,否則它會向Moneris呼叫。