5

मैं एंड्रॉइड स्टूडियो में रोबोलेक्ट्रिक का उपयोग शुरू कर रहा हूं। पहले तो मुझे जो नीचे दिखाया गया है hamcrest का उपयोग कर एक साधारण परीक्षण, बनाना चाहता था:Robolectric 2.4 NoSuchMethodError को गतिविधि बनाते समय RuntimeException पर नहीं डाला जा सकता

@RunWith(CustomTestRunner.class) 
@Config(emulateSdk = 18) 
public class MainActivityTest { 

    private MainActivity mainActivity; 


    @Test 
    public void testMainActivity() { 
     mainActivity = buildActivity(MainActivity.class).create().get(); 
     assertThat(mainActivity, notNullValue()); 
    } 

} 

परीक्षण को क्रियान्वित निम्न अपवाद फेंकता है जब:

java.lang.ClassCastException: java.lang.NoSuchMethodError cannot be cast to java.lang.RuntimeException 
    at org.robolectric.internal.ReflectionHelpers.callInstanceMethodReflectively(ReflectionHelpers.java:68) 
    at org.robolectric.util.ActivityController$1.run(ActivityController.java:115) 
    at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:268) 
    at org.robolectric.util.ActivityController.create(ActivityController.java:111) 
    at org.robolectric.util.ActivityController.create(ActivityController.java:122) 
    at com.enprodo.wakemethere.googleservices.geofence.GeofenceTest.testReceiver(GeofenceTest.java:31) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    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.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:236) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    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:158) 
    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:74) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 

CustomTestRunner वर्ग इस तरह दिखता है:

public class CustomTestRunner extends RobolectricTestRunner { 

    public CustomTestRunner(Class<?> testClass) throws InitializationError { 
     super(testClass); 
    } 

    @Override 
    protected AndroidManifest getAppManifest(Config config) { 
     String manifestProperty = System.getProperty("android.manifest"); 
     if (config.manifest().equals(Config.DEFAULT) && manifestProperty != null) { 
      String resProperty = System.getProperty("android.resources"); 
      String assetsProperty = System.getProperty("android.assets"); 
      AndroidManifest androidManifest = new AndroidManifest(
        Fs.fileFromPath(manifestProperty), 
        Fs.fileFromPath(resProperty), 
        Fs.fileFromPath(assetsProperty)); 
      androidManifest.setPackageName("com.package"); 
      return androidManifest; 
     } 
     return super.getAppManifest(config); 
    } 
} 

मैं जोड़ सकता हूं कि मुख्य गतिविधि android.support.v7.app.ActionBarActivity फैली हुई है लेकिन मुझे नहीं पता कि यह व्यवहार को प्रभावित करता है या नहीं।

Robolectric स्रोत में कुछ खुदाई के बाद यह त्रुटि दिखाई देती है प्रकट होता है जब इस निष्पादित होने

ReflectionHelpers.callInstanceMethodReflectively(component, "performCreate", new ReflectionHelpers.ClassParameter(Bundle.class, bundle)); 

callInstanceMethodReflectively के कोड इस तरह दिखता है:

public static <R> R callInstanceMethodReflectively(final Object instance, final String methodName, ClassParameter... classParameters) { 
    try { 
     final Class[] classes = ClassParameter.getClasses(classParameters); 
     final Object[] values = ClassParameter.getValues(classParameters); 

     return traverseClassHierarchy(instance.getClass(), NoSuchMethodException.class, new InsideTraversal<R>() { 
     @Override 
     public R run(Class traversalClass) throws Exception { 
      Method declaredMethod = traversalClass.getDeclaredMethod(methodName, classes); 
      declaredMethod.setAccessible(true); 
      return (R) declaredMethod.invoke(instance, values); 
     } 
     }); 
    } catch (InvocationTargetException e) { 
     throw (RuntimeException) e.getTargetException(); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
    } 

मैं एक प्रतिबिंब विशेषज्ञ नहीं हूँ, लेकिन ऐसा लगता है कि किसी भी तरह प्रदर्शन करें विधि नहीं मिल सका। क्या किसी को भी इसी तरह का मुद्दा सामने आया है? क्या किसी को पता है कि समस्या क्या हो सकती है?

उत्तर

2

कुछ और खुदाई के बाद ऐसा लगता है कि Robolectric 2.4 के साथ ActionBarActivity के साथ कुछ समस्याएं दिखाई देती हैं। this issue के अनुसार appcompat-v7 के लिए पूर्ण समर्थन Robolectric 3.0 में प्रदान किया जाएगा। दरअसल रोबॉलेक्ट्रिक 3.0-स्नैपशॉट की कोशिश करने से इस मुद्दे को हल किया गया।

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