2016-12-10 47 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呼叫。