11

इसलिए मैंने संदर्भ मार्गदर्शिका here पर आधारित पावर मॉक सेट अप किया। यह सब एक एकल परीक्षा वर्ग के साथ पूरी तरह से ठीक लगता है। लेकिन जब कई जुनीट परीक्षण निष्पादित करते हैं तो मुझे दूसरी टेस्ट क्लास में निम्न त्रुटि मिल रही है।क्लासकास्ट अपवाद अपवाद एकाधिक फ़ाइलों पर पावर मॉक के साथ रोबोलेक्ट्रिक परीक्षण चलाते समय

जैसा कि आप नीचे दिए गए स्टैकट्रैक से देख सकते हैं, मैं बस उदाहरण के लिए नकल करने की कोशिश कर रहा हूं। यह पहली टेस्ट क्लास पर ठीक से नकली लग रहा था लेकिन दूसरी कक्षा में मुझे इस वर्ग का अपवाद मिल रहा है।

स्टैकट्रेस मैं Objenisis कैश निष्क्रिय करने के लिए सुझाव हो रही है, लेकिन मुझे यकीन है कि पूरा करने के लिए कैसे नहीं कर रहा हूँ और अगर है कि वास्तव में मूल कारण है के रूप में मैं classloading-Xstream उपयोग कर रहा हूँ पर: Robolectric विकी लिंक संलग्न अनुसार 1.6.2 ऊपर।

यह बात है कि यदि मैं एक एकल जुनीट टेस्ट क्लास चलाता हूं तो मेरा सेटअप अच्छी तरह से काम करता है, लेकिन एक बार जब मैं पैकेज में सभी परीक्षण चलाने की कोशिश करता हूं तो पहला टेस्ट काम करेगा और बाद के परीक्षण क्लास कास्ट अपवाद प्राप्त करेंगे।

org.mockito.exceptions.base.MockitoException: 
    ClassCastException occurred while creating the mockito proxy : 
     class to mock : 'com.squareup.otto.Bus', loaded by classloader : '[email protected]48d' 
     created class : 'com.squareup.otto.Bus$$EnhancerByMockitoWithCGLIB$$82a3b196', loaded by classloader : '[email protected]48d' 
     proxy instance class : 'com.squareup.otto.Bus$$EnhancerByMockitoWithCGLIB$$82a3b196', loaded by classloader : '[email protected]' 
     instance creation by : ObjenesisInstantiator 

    You might experience classloading issues, disabling the Objenesis cache *might* help (see MockitoConfiguration) 
     at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:61) 
     at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:49) 
     at org.powermock.api.mockito.repackaged.CglibMockMaker.createMock(CglibMockMaker.java:24) 
     at org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.createMock(PowerMockMaker.java:45) 
     at com.acme.android.myapp.services.gcm.handlers.RequestLogoutHandlerTest.setup(RequestLogoutHandlerTest.java:39) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
     at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:251) 
     at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188) 
     at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
     at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:152) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
     at org.junit.runners.Suite.runChild(Suite.java:128) 
     at org.junit.runners.Suite.runChild(Suite.java:27) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
     at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
     at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) 
     at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
     at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 
    Caused by: java.lang.ClassCastException: Cannot cast com.squareup.otto.Bus$$EnhancerByMockitoWithCGLIB$$82a3b196 to com.squareup.otto.Bus 
     at java.lang.Class.cast(Class.java:3369) 
     at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:59) 
     at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:49) 
     at org.powermock.api.mockito.repackaged.CglibMockMaker.createMock(CglibMockMaker.java:24) 
     at org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.createMock(PowerMockMaker.java:45) 
     at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33) 
     at org.mockito.internal.MockitoCore.mock(MockitoCore.java:59) 
     at org.mockito.Mockito.mock(Mockito.java:1285) 
     at org.mockito.Mockito.mock(Mockito.java:1163) 
     ... 36 more 


    org.mockito.exceptions.base.MockitoException: 
    ClassCastException occurred while creating the mockito proxy : 
     class to mock : 'com.squareup.otto.Bus', loaded by classloader : '[email protected]48d' 
     created class : 'com.squareup.otto.Bus$$EnhancerByMockitoWithCGLIB$$82a3b196', loaded by classloader : '[email protected]48d' 
     proxy instance class : 'com.squareup.otto.Bus$$EnhancerByMockitoWithCGLIB$$82a3b196', loaded by classloader : '[email protected]' 
     instance creation by : ObjenesisInstantiator 

    You might experience classloading issues, disabling the Objenesis cache *might* help (see MockitoConfiguration) 
     at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:61) 
     at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:49) 
     at org.powermock.api.mockito.repackaged.CglibMockMaker.createMock(CglibMockMaker.java:24) 
     at org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.createMock(PowerMockMaker.java:45) 
     at com.acme.android.myapp.services.gcm.handlers.RequestLogoutHandlerTest.setup(RequestLogoutHandlerTest.java:39) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
     at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:251) 
     at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188) 
     at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
     at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:152) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
     at org.junit.runners.Suite.runChild(Suite.java:128) 
     at org.junit.runners.Suite.runChild(Suite.java:27) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
     at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
     at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) 
     at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
     at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:6 

उत्तर

2

तो मैं

@PowerMockIgnore({ "*.*" }) 
@PrepareForTest({ StaticClass1.class,StaticClass2.class }) 

कि पावर नकली सभी वर्गों की अनदेखी कर देगा जोड़कर इस समस्या का समाधान। मेरे मामले में पावरमोक बस को वर्गीकृत कर रहा था, जो मेरे कोड में वास्तव में मॉकिटो द्वारा मजाक कर दिया गया था। एक बार मैंने परीक्षण में सभी कक्षाओं के ऊपर एनोटेशन जोड़े बिना किसी त्रुटि के काम किया।

+0

यह कुछ मामलों में काम कर सकता है, लेकिन यदि आपके पास परीक्षणों का एक सूट है जिसमें PowerMockito और Mockito दोनों का मिश्रित उपयोग है, तो मुझे ऐसा करने में समस्याएं मिली हैं। PowerPockito का उपयोग करने वाले मेरे परीक्षणों पर @PowerMockIgnore ({"org.mockito। *"}} के साथ MockitoConfiguration क्लास का उपयोग करके जवाब का संयोजन करना। – jdonmoyer

15

मैं अपवाद संदेश में सुझाए गए अनुसार मॉकिटो के क्लास कैश को अक्षम करने का सुझाव दूंगा। एंड्रॉइड स्टूडियो में एक मॉकिटो कॉन्फ़िगरेशन क्लास जोड़कर मैं मैकिटो क्लास कैश को अक्षम करता हूं।

  1. अपने इकाई परीक्षण निर्देशिका हैं src/परीक्षण/जावा के तहत, एक पैकेज निर्देशिका बिल्कुल Mockito विन्यास पैकेज, org/mockito/विन्यास रूप में ही है कि पैदा करते हैं।

  2. तो पूर्ण परीक्षण निर्देशिका src/test/java/org/mockito/config के तहत, MockitoConfiguration नामक एक नई श्रेणी जोड़ें।

  3. सक्षम क्लास कैश() विधि को निम्नानुसार ओवरराइट करें।

    package org.mockito.configuration; 
    
        public class MockitoConfiguration extends DefaultMockitoConfiguration { 
    
        @Override 
        public boolean enableClassCache() { 
         return false; 
        } 
    } 
    
  4. आप src/जावा/परीक्षण के तहत अपने यूनिट परीक्षण चलाते हैं, अपने MockitoConfiguration लोड किया जाना चाहिए और Mockito वर्ग कैश अक्षम है या नहीं।

उम्मीद है कि यह मदद करता है।

+0

बहुत बढ़िया। धन्यवाद! – Kevin

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