Robolectric: how to test SherlockActivity

I am trying to run tests in an Activity that extends SherlockActivity. I read everything I could find about solutions for testing actions using ActionBarSherlock, and also tried doing https://github.com/passy/absshadow-sample

this is what i am doing now:

custom test runner

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 sherlockactivity:

 @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 }; } } 

for some reason his audit is not with this:

 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) 

my activity calls setContentView first, before any findViewById .

the strange part is that no matter what I do in the shadow implementation of setContentView , nothing happens (for example, throwing a NullPojnterException ). my shadow is logged, as if I tried to override the onCreate implementation and throw an exception there, it works.

What am I missing here?

+6
source share
1 answer

apparently changing the Java SDK in the Intellij project settings to Oracle instead of OpenJDK fixed this problem for me.

+2
source

All Articles