2013-03-21 10 views
8

क्षमा करें अगर यह एक नौसिखिया प्रश्न है, लेकिन मैं वास्तव में किसी भी समस्या के संबंध में समुदाय की पेशकश कर सकता हूं जो मुझे निम्नलिखित विधि को रोकने के साथ है। एक Grails सेवा, स्थान सेवा में है।ग्रिल्स और ग्राईल्स डोमेन क्लास में अन्य विधियों को रोकने के लिए स्पॉक का उपयोग करना

Location locate(String target, String locator, Application app, boolean sync = true) { 
    if (!target) throw new IllegalArgumentException("Illegal value for msid: " + target) 
    def locRequest = Request.create(target, Type.LOCATE) 
    if (!locRequest.save()) { 
      return Location.error(target, "Error persisting location request") 
    } 
    locationSource.locateTarget(target, locator, app, sync) 
} 

मेरे पास एक डोमेन क्लास, अनुरोध है, साथ ही साथ डिफ़ॉल्ट GORM विधियों में कुछ अतिरिक्त डोमेन विधियां भी हैं, उदाहरण के लिए।

@EqualsAndHashCode 
class Request { 

    String reference 
    String msid 
    Type type 
    Status status 
    Destination destination 
    DateTime dateCreated 
    DateTime dateCompleted 

    static create(String msid, Type type, Destination destination = Destination.DEFAULT) { 
      new Request(reference: reference(type), type: type, status: Status.INITIATED, dateCreated: new DateTime()) 
    } 

अंत में, मेरे पास एक स्पॉक विनिर्देश है। मुझे डिफ़ॉल्ट GORM विधियों को नकल करने की आवश्यकता है, लेकिन कुछ परीक्षण डोमेन के तहत कोड में बने रहने के लिए वैध ऑब्जेक्ट को वापस करने के लिए कुछ अतिरिक्त डोमेन तर्क, उदाहरण के लिए, स्थिर स्थिर विधि को भी रोकना है।

आदर्श रूप से, मैं स्पॉक मैक्स का उपयोग करता हूं लेकिन मैं उन्हें पीटर एन से नीचे दिए गए पद के अनुसार यहां उपयोग नहीं कर सकता, उन्हें कॉलर में इंजेक्शन देने की आवश्यकता है और इस मामले में अनुरोध (जिसे मैं नकल करने की कोशिश कर रहा हूं

https://groups.google.com/forum/?fromgroups=#!topic/spockframework/JemiKvUiBdo

न ही मैं के रूप में Grails 2.x @Mock एनोटेशन का उपयोग कर सकते हैं, हालांकि यह GORM तरीकों नकली जाएगा, मैं अगर अनिश्चित हूं:), LocationService में पता लगाने विधि में एक स्थानीय चर के रूप में बनाया गया है मैं अनुरोध वर्ग से अतिरिक्त स्थैतिक निर्माण() विधि को नकल/स्टब कर सकता हूं।

इसलिए, आखिरकार, मैं ऐसा करने के लिए ग्रोवी स्टबफ़ोर/मॉकफोर विधियों का उपयोग करने की कोशिश कर रहा हूं क्योंकि मेरा मानना ​​है कि इन्हें उपयोग बंद करने के लिए (नीचे के रूप में) में लपेटकर परीक्षण विधि में कॉल में उपयोग किया जाएगा। ,

@TestFor(LocationService) 
// @Mock(Request) 
class LocationServiceSpec extends Specification { 

    @Shared app = "TEST_APP" 
    @Shared target = "123" 
    @Shared locator = "999" 

    def locationService = new LocationService() 
    LocationSource locationSource = Mock() 


    def "locating a valid target should default to locating a target synchronously"() { 
     given: 
      def stub = new StubFor(Request) 
      stub.demand.create { target, type -> new Request(msid: target, type: type) } 
      stub.demand.save { true } 
      1 * locationSource.locateTarget(target, locator, app, SYNC) >> { Location.create(target, point, cellId, lac) } 
      def location 
     when: 
      stub.use { 
       location = locationService.locate(target, locator, app) 
      } 
     then: 
      location 
} 

हालांकि जब मैं परीक्षण चलाने, हालांकि टोंटदार विधि बनाने देता है मेरी अनुरोध ठूंठ वस्तु, मैं विधि बचाने टोंटदार पर एक विफलता मिलती है::

यहाँ परीक्षण कल्पना है

groovy.lang.MissingMethodException: No signature of method:  com.domain.Request.save() is applicable for argument types:() values: [] 
Possible solutions: save(), save(boolean), save(java.util.Map), wait(), last(), any() 

क्या कोई यह बता सकता है कि मैं यहां क्या कर रहा हूं या मेरे विशेष मामले को हल करने के लिए सबसे अच्छा तरीका सुझा सकता हूं यदि अतिरिक्त विधियों को रोकने के लिए और साथ ही साथ डोमेन क्लास के जीओआरएम विधियों को भी हल किया जा सकता है जिसे मैं सीधे कोड में इंजेक्ट नहीं कर सकता परीक्षा?

अग्रिम धन्यवाद,

पैट्रिक

उत्तर

8

मेरा मानना ​​है कि आप Grails '@Mock एनोटेशन उपयोग करने के लिए की तरह आप GORM तरीकों के लिए उल्लेख किया है में सक्षम होना चाहिए, और फिर आप मैन्युअल रूप से स्थिर तरीकों उपहास करने के लिए की आवश्यकता होगी:

@TestFor(LocationService) 
@Mock(Request)// This will mock the GORM methods, as you suggested 
class LocationServiceSpec extends Specification { 
... 
    void setup() { 
     Request.metaClass.static.create = { String msid, Type type, Destination destination = Destination.DEFAULT -> 
      //Some logic here 
     } 
    } 
... 

@Mock एनोटेशन का उपयोग कर, Grails डिफ़ॉल्ट तरीकों (बचाने के लिए/प्राप्त/गतिशील ढूँढ़ने वाले) नकली होगा, लेकिन यह किसी भी अतिरिक्त तरीकों आपने जोड़ा हो, के लिए कुछ भी नहीं है, इसलिए आप मनु को जरूरत सहयोगी उनको नकली करो।

+0

धन्यवाद GrailsGuy। यह मेरी समस्या हल हो गया है। मैं डिफ़ॉल्ट विधियों का नकल करने और मैन्युअल रूप से अतिरिक्त विधियों को ओवरराइड करने के लिए '@ मॉक' का उपयोग करने के बीच एक उलझन में पड़ रहा था। '@ मॉक' का उपयोग करके मुझे पूर्व दिया लेकिन बाद वाला नहीं। और StubFor का उपयोग करके मुझे बाद वाला दिया लेकिन पूर्व नहीं। लेकिन वे संयोजन के रूप में काम नहीं कर रहे थे। हालांकि, पूर्व के लिए '@ मॉक' का उपयोग करके और मेटा क्लास को संशोधित करने के बाद बाद में समस्या पूरी तरह से हल हो जाती है। बहुत धन्यवाद। – Paddy

+1

@ पिताजी कोई समस्या नहीं, खुश मैं मदद कर सकता था! – Igor

+1

@ इगोर होना चाहिए "Request.metaClass.static.create ..." यही मेरे लिए काम किया है! – Champ

संबंधित मुद्दे