2012-11-04 16 views
6

Sto provando a eseguire test su un'attività che estende SherlockActivity. Ho letto tutto quello che potevo trovare circa le soluzioni per attività di testing con ActionBarSherlock e provato anche a seguito https://github.com/passy/absshadow-sampleRobolectric: come testare una SherlockActivity

questo è quello che sto facendo attualmente:

test personalizzati corridore:

public class CustomTestRunner extends RobolectricTestRunner { 
    private static final int SDK_INT = Build.VERSION.SDK_INT; 

    public CustomTestRunner(Class<?> testClass) throws InitializationError { 
     super(testClass); 
     addClassOrPackageToInstrument("com.actionbarsherlock.app.SherlockActivity"); 
    } 

    @Override 
    protected void bindShadowClasses() { 
     super.bindShadowClasses(); 
     Robolectric.bindShadowClass(ShadowSherlockActivity.class); 
    } 

    @Override 
    public void beforeTest(final Method method) { 
     final int targetSdkVersion = robolectricConfig.getSdkVersion(); 
     setStaticValue(Build.VERSION.class, "SDK_INT", targetSdkVersion); 
    } 

    @Override 
    public void afterTest(final Method method) { 
     resetStaticState(); 
    } 

    @Override 
    public void resetStaticState() { 
     setStaticValue(Build.VERSION.class, "SDK_INT", SDK_INT); 
    } 
} 

shadow SherlockAttività:

@Implements(SherlockActivity.class) 
public class ShadowSherlockActivity extends ShadowActivity { 

    @Implementation 
    public void setContentView(int layoutResID) { 
     super.setContentView(layoutResID); // TODO Auto-generated method stub 
    } 

    @Implementation 
    public ActionBar getSupportActionBar() { 
     return new ActionBar() { 
      // removed for readability 
     }; 
    } 
} 

per qualche ragione i suoi omaggi in mancanza di questo:

WARNING: you probably should have called setContentView() first 
java.lang.Exception: Stack trace 
    at java.lang.Thread.dumpStack(Thread.java:1342) 
    at  com.xtremelabs.robolectric.shadows.ShadowActivity.findViewById(ShadowActivity.java:183) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.xtremelabs.robolectric.bytecode.ShadowWrangler.methodInvoked(ShadowWrangler.java:99) 
    at com.xtremelabs.robolectric.bytecode.RobolectricInternals.methodInvoked(RobolectricInternals.java:144) 
    at android.app.Activity.findViewById(Activity.java) 
    at com.dgti.ds.activities.ChooseLocationActivity.findViews(ChooseLocationActivity.java:44) 
    at com.dgti.ds.activities.ChooseLocationActivity.onCreate(ChooseLocationActivity.java:34) 
    at com.dgti.ds.activities.ChooseLocationActivityTests.shouldGetGoogleAPIKeyIfNull(ChooseLocationActivityTests.java:81) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
    at com.xtremelabs.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:288) 
    at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:76) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 

la mia attività non chiamano setContentView prima, prima di ogni findViewById.

la parte strana è che non importa quello che faccio nell'implementazione shadow di setContentView, non sembra accadere nulla (ad esempio, lanciando un NullPojnterException). la mia ombra viene registrata, come se provassi a sovrascrivere l'implementazione di onCreate e laggiù l'eccezione, funziona.

cosa mi manca qui?

risposta

2

apparentemente la modifica dell'SDK Java nelle impostazioni del progetto di Intellij su Oracle invece di OpenJDK ha risolto il problema per me.

+0

Ho lo stesso problema nonostante stia utilizzando Oracle Java SDK, ho sempre ricevuto ATTENZIONE: probabilmente dovresti aver chiamato setContentView() prima hai un altro suggerimento/correzione? – vsm

Problemi correlati