परीक्षण के लिए एक हाइबरनेट प्रॉक्सी अनुकरण निम्न के समान एक डोमेन वर्ग पदानुक्रम के साथ grails का उपयोग करते समय:Grails:
abstract class Vehicle { ... }
class Car extends Vehicle { ... }
class Motorcycle extends Vehicle { ... }
और निम्नलिखित के रूप में एक सेवा:
class VehicleService {
def startRepairing(Car car) { ... }
def startRepairing(Motorcycle motorcycle) { ... }
}
हम बहुत बार हम सामना निम्नलिखित में त्रुटियों के रूप में त्रुटियां:
विधि का कोई हस्ताक्षर नहीं: VehicleService.startRepairing()के लिए लागू हैतर्क प्रकार: (कार _ $$ _ javassist_156) मूल्य: [आईडी: 42343, कक्षा: कार]। संभावित समाधान: startRepairing (कार)
हमारा मानना है कि ऐसा होता है क्योंकि हम एक संग्रह के रूप में static hasMany = [vehicles: Vehicle]
है, जिससे प्रॉक्सी सार वर्ग Vehicle
नहीं बल्कि ठोस वर्ग (Car
को लागू करने का कारण बनता है से Vehicle
उदाहरण पुनः प्राप्त, Motorcycle
, आदि)।
हम एक समाधान के रूप में विधि से तर्क प्रकार निकालने के लिए किया है, लेकिन हम नहीं बल्कि यह होता है - कोड क्लीनर है, विधि अधिभार संभव है, और अधिक आईडीई अनुकूल है ...
एक समाधान हमने सोचा के बारे में है कुख्यात GrailsHibernateUtil.unwrapIfProxy उपयोग करने के लिए जब प्रकार किसी भी अन्य विधि से मेल नहीं खाता:
class VehicleService {
def startRepairing(Vehicle vehicle) {
startRepairing(GrailsHibernateUtil.unwrapIfProxy(vehicle))
}
def startRepairing(Car car) {
/* actual business logic here */
}
def startRepairing(Motorcycle motorcycle) {
/* actual business logic here */
}
}
लेकिन फिर सवाल, कैसे हम इस परीक्षण कर सकते हैं कर रहा है? विकास में कोड चलाते समय हमें शायद ही कभी जावास्त्री की समस्या मिलती है, और यहां तक कि उत्पादन में भी यह "यादृच्छिक रूप से" होता है (या अधिक सटीक, हमारे ज्ञान से बचने वाली स्थितियों के कारण :)।
क्या एक उदाहरण को जवासिस्ट प्रॉक्सी होने के लिए मजबूर करना संभव है? सामान्य रूप से इस तरह की समस्याओं के लिए एक अच्छी रणनीति क्या होगी?
यो यूकान ग्रोवी के गतिशील पक्ष का उपयोग करें और अपने कोड में कार के बजाय ऑब्जेक्ट घोषित करें। रनटाइम पर, विधि प्रॉक्सी इंस्टेंस पर पाई जाएगी और सभी ठीक होंगे। – MatRt
परीक्षण सीमाओं के कारण मेरी विधि के हस्ताक्षर को बदलना मेरे लिए अच्छा नहीं लगता है: -/ – Deigote