जब आप विरासत कोड के लिए इकाई परीक्षण बनाना चाहते हैं तो स्पाई उपयोगी हो सकता है ।
मैंने यहां एक रन करने योग्य उदाहरण बनाया है https://www.surasint.com/mockito-with-spy/ , मैं इसमें से कुछ को कॉपी करता हूं।
यदि आपके पास इस कोड जैसा कुछ है:
public void transfer( DepositMoneyService depositMoneyService, WithdrawMoneyService withdrawMoneyService,
double amount, String fromAccount, String toAccount){
withdrawMoneyService.withdraw(fromAccount,amount);
depositMoneyService.deposit(toAccount,amount);
}
आपको जासूसी की आवश्यकता नहीं हो सकती है क्योंकि आप केवल जमा राशि जमा कर सकते हैं
लेकिन कुछ के साथ, विरासत कोड, निर्भरता इस तरह कोड में है:
public void transfer(String fromAccount, String toAccount, double amount){
this.depositeMoneyService = new DepositMoneyService();
this.withdrawMoneyService = new WithdrawMoneyService();
withdrawMoneyService.withdraw(fromAccount,amount);
depositeMoneyService.deposit(toAccount,amount);
}
हां, आप पहले कोड में बदल सकते हैं लेकिन फिर एपीआई बदल दिया जाता है। यदि इस विधि का उपयोग कई स्थानों पर किया जा रहा है, तो आपको उन सभी को बदलना होगा।
वैकल्पिक यह है कि आप इस तरह निर्भरता निकाल सकते हैं:
public void transfer(String fromAccount, String toAccount, double amount){
this.depositeMoneyService = proxyDepositMoneyServiceCreator();
this.withdrawMoneyService = proxyWithdrawMoneyServiceCreator();
withdrawMoneyService.withdraw(fromAccount,amount);
depositeMoneyService.deposit(toAccount,amount);
}
DepositMoneyService proxyDepositMoneyServiceCreator() {
return new DepositMoneyService();
}
WithdrawMoneyService proxyWithdrawMoneyServiceCreator() {
return new WithdrawMoneyService();
}
तो आप इस तरह से निर्भरता इंजेक्षन जासूस का उपयोग कर सकते हैं:
DepositMoneyService mockDepositMoneyService = mock(DepositMoneyService.class);
WithdrawMoneyService mockWithdrawMoneyService = mock(WithdrawMoneyService.class);
TransferMoneyService target = spy(new TransferMoneyService());
doReturn(mockDepositMoneyService)
.when(target).proxyDepositMoneyServiceCreator();
doReturn(mockWithdrawMoneyService)
.when(target).proxyWithdrawMoneyServiceCreator();
ऊपर दिए गए लिंक में अधिक विस्तार।