2013-12-13 6 views
16

मैं एंड्रॉइड रोबोलेक्ट्रिक परीक्षणों में कुछ स्थिर तरीकों का नकल करने के लिए PowerMockito का उपयोग करने की कोशिश कर रहा हूं। मैं जुनीट 4.8.2, रोबोलेक्ट्रिक 2.2, मॉकिटो 1.9.5, और पावरमैक 1.9.5 का उपयोग कर रहा हूं here। जैसा कि मुझे RoboElectricTestRunner का उपयोग करना है, मैं बूटस्ट्रैप PowerMock में PowerMockRule का उपयोग करने का प्रयास कर रहा हूं। हालांकि मुझे PowerMock के साथ परीक्षण दुर्भाग्यपूर्ण java.lang.IncompatibleClassChangeError मिल रहा है। हर इकाई परीक्षण परपावरमैक और रोबोलेक्ट्रिक का उपयोग करना - असंगत क्लास चेंजएरर

java.lang.IncompatibleClassChangeError: class org.objectweb.asm.tree.ClassNode has interface org.objectweb.asm.ClassVisitor as super class at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637) at java.lang.ClassLoader.defineClass(ClassLoader.java:621) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method)

:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:323) at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:348)

Caused by: java.lang.IncompatibleClassChangeError: Implementing class at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637) at java.lang.ClassLoader.defineClass(ClassLoader.java:621) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)

अगर मैं org.powermock पुस्तकालयों मैं के बाद org.ow2.asm डाल दिया।

मैवेन डिप्टी के अनुसार: पेड़ रोबोलेक्ट्रिक और पावरमैक किसी भी निर्भरता को साझा नहीं करते हैं। लेकिन जाहिरा तौर पर org.powermock: powermock मॉड्यूल-javaagent कुछ org/objectweb/ASM वर्गों पैकेज, और Robolectric org.ow2.asm पर निर्भर करता है: एएसएम: जार: 4.1 किसी विरोध।


@RunWith(RobolectricTestRunner.class) 
@PrepareForTest(Helper.class) 
@PowerMockIgnore({"com.sun.jmx.*", "javax.management.*"}) 
public class HelpFragTest { 

    @Rule 
    public PowerMockRule rule = new PowerMockRule(); 

    static { 
     PowerMockAgent.initializeIfNeeded(); 
    } 

    FragmentActivity fragmentActivity; 
    FragmentManager fragmentManager; 
    ActionBarManager actionBarManager; 

    @Before 
    public void setup(){ 
     actionBarManager = mock(ActionBarManager.class); 
     LowesApplication.instance().setActionBarManager(actionBarManager); 
     fragmentActivity = Robolectric.buildActivity(FragmentActivity.class).create().start().resume().get(); 
     fragmentManager = fragmentActivity.getSupportFragmentManager(); 
    } 

    @Test 
    public void testShow(){ 
     mockStatic(Helper.class); 

     HelpFrag helpFrag = HelpFrag.newInstance(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     fragmentTransaction.add(helpFrag, null); 
     fragmentTransaction.commit(); 

     assertTrue(helpFrag.isVisible()); 
    } 
} 
+0

शक्ति का उपयोग करने के लिए नकली आप इसे चलाने के लिए है पावर मॉक धावक के साथ। तो जब आप इसे रोबोलेक्ट्रिक टेस्ट रनर के साथ चलाने की कोशिश करते हैं तो इसका अर्थ नहीं है –

+2

@EugenMartynov यह समस्या है कि जावाजेंट और 'पावरमोकरुले' को हल करने की समस्या है, [PowerMockRule] देखें (http://code.google.com/ पी/पावरमॉक/विकी/पावरमोकरूल) और [पावरमोकएजेंट] (http://code.google.com/p/powermock/wiki/PowerMockAgent)। –

+0

कूल, अगर आप इसे हल करते हैं तो मुझे बताएं क्योंकि यह हमारे लिए भी समस्या है –

उत्तर

9

मैं Robolectric साथ संयोजन के रूप में उपयोग करने के लिए PowerMock एक रास्ता मिल गया।

मानक पावरमैक जार के अतिरिक्त, पावरमॉक जुनीट नियम भी आवश्यक है। यह here वर्णित करने के लिए वर्णित है। मैंने xstream क्लासलोडिंग संस्करण का उपयोग किया, क्योंकि objenesis एक बहुत छोटी है। यह PowerMock 1.5.5 और Robolectric 2.3 के साथ काम कर रहा है, मैं पुराने संस्करणों के बारे में बात नहीं कर सकता। कृपया ध्यान दें कि जावा एजेंट को शामिल नहीं किया जाना चाहिए, क्योंकि मेरे अनुभव से यह समस्याएं पैदा करता है।

तो अगर आप Maven का उपयोग कर रहे हैं, इन निर्भरता घोषित किया जाना चाहिए:

<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-module-junit4</artifactId> 
    <version>${powermock.version}</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-module-junit4-rule</artifactId> 
    <version>${powermock.version}</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-api-mockito</artifactId> 
    <version>${powermock.version}</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-classloading-xstream</artifactId> 
    <version>${powermock.version}</version> 
    <scope>test</scope> 
</dependency> 

तो फिर तुम सेटअप करने के लिए है इस तरह अपने परीक्षण वर्ग:

@RunWith(RobolectricTestRunner.class) 
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" }) 
@PrepareForTest(Static.class) 
public class MyTest { 

    @Rule 
    public PowerMockRule rule = new PowerMockRule(); 

    private MyActivity activity; 

    @Before 
    public void setup() { 
     activity = Robolectric.buildActivity(MyActivity.class).create().get(); 
    } 

    @Test 
    public void test() throws Exception { 
     PowerMockito.mockStatic(Static.class); 
     Mockito.when(Static.getCurrentTime()).thenReturn(1); 

     Assert.assertEquals(1, activity.getId()); 
    } 
} 
+0

मैंने इस विधि के साथ कुछ काम किया, यह संबंधित एंड्रॉइड मुद्दे में पोस्ट किया गया था, और मैं Robolectric क्लासलोडर और Powermock क्लासलोडर के बीच विवादित चीजों के साथ फिट बैठता था। –

+0

यह मेरे लिए काम किया! धन्यवाद :) –

+0

ध्यान दें कि Robolectric छाया में सही ढंग से लोड नहीं हो रहा है, यह कुछ ऐसा है जो मैं वर्तमान में इस सेटअप के साथ अनुभव कर रहा हूं –

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