2013-04-05 4 views
12

में पहली बार टाइमर, माफ कीजिए अगर मुझे कुछ याद आया है। मैं स्पॉक का उपयोग कर एक स्थिर विधि पर कॉल करने की उम्मीद कर रहा हूं। फीडबैक बहुत अच्छा होगाग्रोवीमॉक के साथ नकली स्थैतिक विधि या स्पॉक

ग्रोवी मैक्स के साथ, मैंने सोचा कि मैं स्थिर कॉल को प्राप्त करने में सक्षम हूं लेकिन इसे नहीं मिला है। पृष्ठभूमि के लिए, मैं विरासत जावा में परीक्षणों को फिर से शुरू करने की प्रक्रिया में हूं। रिफैक्टरिंग प्रतिबंधित है। मैं groovy-1.8 के साथ spock-0.7 का उपयोग कर रहा हूँ।

स्थिर विधि करने के लिए कॉल इस रूप में एक उदाहरण कॉल के साथ श्रृंखलित है:

public class ClassUnderTest{ 

public void methodUnderTest(Parameter param){ 
    //everything else commented out 
Thing someThing = ClassWithStatic.staticMethodThatReturnsAnInstance().instanceMethod(param); 
    } 

} 

staticMethod ClassWithStatic instanceMethod का एक उदाहरण देता है बात विधि के बाकी हिस्सों में जरूरत रिटर्न

हैं मैं सीधे ग्लोबल मॉक का उपयोग करता हूं, यह मॉक किए गए इंस्टेंस को ठीक करता है ठीक है:

def exerciseTheStaticMock(){ 
    given: 
    def globalMock = GroovyMock(ClassWithStatic,global: true) 
    def instanceMock = Mock(ClassWithStatic) 

    when: 
    println(ClassWithStatic.staticMethodThatReturnsAnInstance().instanceMethod(testParam)) 

    then: 
    interaction{ 
     1 * ClassWithStatic.staticMethodThatReturnsAnInstance() >> instanceMock 
     1 * instanceMock.instanceMethod(_) >> returnThing 
    } 
} 

लेकिन अगर मैं मेथो चलाता हूं ClassUnderTest से dUnderTest:

def failingAttemptToGetPastStatic(){ 
    given: 
    def globalMock = GroovyMock(ClassWithStatic,global: true) 
    def instanceMock = Mock(ClassWithStatic) 
    ClassUnderTest myClassUnderTest = new ClassUnderTest() 

    when: 
    myClassUnderTest.methodUnderTest(testParam) 

    then: 
    interaction{ 
     1 * ClassWithStatic.staticMethodThatReturnsAnInstance() >> instanceMock 
     1 * instanceMock.instanceMethod(_) >> returnThing 
    } 
} 

यह है कि इसके instanceMethod में विफल पर चला जाता है ClassWithStatic की एक वास्तविक उदाहरण नीचे फेंकता है।

+1

अगर किसी की सहायता करता है, तो मैं जावा कोड में स्थिर तरीकों को बदलने के लिए स्पोक में ग्रोवीमॉक का उपयोग कर रहा हूं, लेकिन इससे गलत तरीके से अन्य परीक्षण प्रभावित हुए। मैंने समस्या को ठीक करने के लिए इस एनोटेशन का उपयोग किया @ConfineMetaClassChanges – Topera

उत्तर

15

स्पॉक केवल ग्रोवी में लागू स्थिर तरीकों का नकल कर सकता है। जावा में लागू स्थिर तरीकों का मज़ाक उड़ाते हुए, आपको GroovyMock, PowerMock या JMockit जैसे टूल का उपयोग करना होगा।

पीएस: यह देखते हुए कि ये टूल अपने लक्ष्यों को प्राप्त करने के लिए कुछ गहरी चाल खींचते हैं, मुझे यह जानने में दिलचस्पी होगी कि वे ग्रोवी/स्पॉक (जावा/जुनीट के बजाय) में लागू परीक्षणों के साथ कैसे और कितनी अच्छी तरह से काम करते हैं। ।

+0

धन्यवाद पीटर। एकीकृत करने पर आपको जाना होगा और आपको – alexgibbs

+0

पता चलेगा क्या आपको कोई जवाब मिला? मुझे यहां एक उदाहरण दिखाई देता है: https://github.com/kriegaex/Spock_PowerMock – JavaJigs

2

यहाँ है कैसे मैं अपने समान समस्या हल हो जाती स्पॉक (v1.0) और PowerMock (v1.6.4) के साथ (एक स्थिर विधि कॉल जो एक स्थिर वर्ग से बुलाया जा रहा है मजाक)

import org.junit.Rule 
import org.powermock.core.classloader.annotations.PowerMockIgnore 
import org.powermock.core.classloader.annotations.PrepareForTest 
import org.powermock.modules.junit4.rule.PowerMockRule 
import spock.lang.Specification 
import static org.powermock.api.mockito.PowerMockito.mockStatic 
import static org.powermock.api.mockito.PowerMockito.when 

@PrepareForTest([YourStaticClass.class]) 
@PowerMockIgnore(["javax.xml.*", "ch.qos.logback.*", "org.slf4j.*"]) 
class YourSpockSpec extends Specification { 

@Rule 
Powermocked powermocked = new Powermocked(); 

def "something something something something"() { 
    mockStatic(YourStaticClass.class) 

    when: 'something something' 
    def mocked = Mock(YourClass) 
    mocked.someMethod(_) >> "return me" 

    when(YourStaticClass.someStaticMethod(xyz)).thenReturn(mocked) 

    then: 'expect something' 
    YourStaticClass.someStaticMethod(xyz).someMethod(abc) == "return me" 

    } 
} 

@PowerMockIgnore एनोटेशन वैकल्पिक है, केवल मौजूदा पुस्तकालयों के साथ कुछ संघर्ष होने पर इसका उपयोग करें

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