2016-12-10 3 views
0

В приложении с пружинной загрузкой я звоню в 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(), но что делать ип Исключение нулевого указателя на этой линии.

Реальная стоимость против макета?

Кажется, что нереальный вызов сделан для 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 в вашем коде, где вы можете изменить поведение кода без изменения кода, сам. По сути, вы добавляете зависимости, а не имеете зависимости от экземпляра кода, чтобы вы могли издеваться над зависимостями при тестировании. В настоящее время в вашем тестовом коде вы вынуждены использовать реальное значение resAddCC и mpgReq, потому что текущий производственный код создает их с помощью ключевого слова new, вместо того, чтобы использовать завод по заказу, а затем вызывает заводский метод на заводском объекте. Используя такой завод, вы могли бы издеваться над фабрикой и ее вызовом, где иначе обратился бы к Монерису.

Смежные вопросы