Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Robolectric InflateException when using custom action bar layout

I just setup Robolectric testing through this setup and it is giving me an error when I test out my app.

I have narrowed the problem down to the ProgressSpinner which is in my custom ActionBar layout. When I disable the custom ActionBar, the test runs fine. I am using the regular action bar, not ActionBarSherlock.

Is there a workaround to this?

Test Code

@RunWith(RobolectricTestRunner.class)
public class MainActivityTest {

MainActivity activity;

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

@Test
public void shouldHaveHappySmiles() throws Exception 
{
    String hello = this.activity.getString(R.string.app_name);
    assertThat(hello, equalTo("LFDate"));
}

}

Failure Trace

android.view.InflateException: XML file C:\Users\Deric\Documents\GitHub\lfdate\android\res\layout\actionbar.xml line #-1 (sorry, not yet implemented): Error inflating class android.widget.ProgressBar
    at android.view.LayoutInflater.createView(LayoutInflater.java:620)
    at org.robolectric.shadows.RoboLayoutInflater.onCreateView(RoboLayoutInflater.java:38)
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at com.android.internal.app.ActionBarImpl.setCustomView(ActionBarImpl.java:312)
    at android.support.v7.app.ActionBarImplICS.setCustomView(ActionBarImplICS.java:93)
    at android.support.v7.app.ActionBarImplJB.setCustomView(ActionBarImplJB.java:20)
    at com.walintukai.lfdate.MainActivity.onCreate(MainActivity.java:216)
    at android.app.Activity.performCreate(Activity.java:5133)
    at org.fest.reflect.method.Invoker.invoke(Invoker.java:112)
    at org.robolectric.util.ActivityController$1.run(ActivityController.java:113)
    at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:265)
    at org.robolectric.util.ActivityController.create(ActivityController.java:110)
    at org.robolectric.util.ActivityController.create(ActivityController.java:120)
    at com.walintukai.lfdate.MainActivityTest.setup(MainActivityTest.java:20)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:250)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:177)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_createView(LayoutInflater.java:594)
    at android.view.LayoutInflater.createView(LayoutInflater.java)
    at org.robolectric.shadows.RoboLayoutInflater.onCreateView(RoboLayoutInflater.java:38)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_onCreateView(LayoutInflater.java:669)
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_createViewFromTag(LayoutInflater.java:694)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_inflate(LayoutInflater.java:397)
    at android.view.LayoutInflater.inflate(LayoutInflater.java)
    at com.android.internal.app.ActionBarImpl.$$robo$$ActionBarImpl_060b_setCustomView(ActionBarImpl.java:312)
    at com.android.internal.app.ActionBarImpl.setCustomView(ActionBarImpl.java)
    at android.support.v7.app.ActionBarImplICS.$$robo$$ActionBarImplICS_1498_setCustomView(ActionBarImplICS.java:93)
    at android.support.v7.app.ActionBarImplICS.setCustomView(ActionBarImplICS.java)
    at android.support.v7.app.ActionBarImplJB.setCustomView(ActionBarImplJB.java:20)
    at com.walintukai.lfdate.MainActivity.onCreate(MainActivity.java:216)
    at android.app.Activity.$$robo$$Activity_c57b_performCreate(Activity.java:5133)
    at android.app.Activity.performCreate(Activity.java)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.fest.reflect.method.Invoker.invoke(Invoker.java:112)
    at org.robolectric.util.ActivityController$1.run(ActivityController.java:113)
    at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:265)
    at org.robolectric.util.ActivityController.create(ActivityController.java:110)
    at org.robolectric.util.ActivityController.create(ActivityController.java:120)
    at com.walintukai.lfdate.MainActivityTest.setup(MainActivityTest.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    ... 21 more
Caused by: java.lang.NullPointerException
    at org.robolectric.shadows.ShadowResources.attrsToTypedArray(ShadowResources.java:165)
    at org.robolectric.shadows.ShadowResources.access$000(ShadowResources.java:55)
    at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:494)
    at android.content.res.Resources$Theme.obtainStyledAttributes(Resources.java)
    at android.content.Context.obtainStyledAttributes(Context.java:416)
    at android.view.View.__constructor__(View.java:3317)
    at org.fest.reflect.method.Invoker.invoke(Invoker.java:112)
    at org.robolectric.shadows.ShadowView.__constructor__(ShadowView.java:63)
    at android.view.View.<init>(View.java:3315)
    at android.widget.ProgressBar.<init>(ProgressBar.java:253)
    at android.widget.ProgressBar.<init>(ProgressBar.java:246)
    at android.widget.ProgressBar.<init>(ProgressBar.java:242)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    at org.robolectric.shadows.RoboLayoutInflater.onCreateView(RoboLayoutInflater.java:38)
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at com.android.internal.app.ActionBarImpl.setCustomView(ActionBarImpl.java:312)
    at android.support.v7.app.ActionBarImplICS.setCustomView(ActionBarImplICS.java:93)
    at android.support.v7.app.ActionBarImplJB.setCustomView(ActionBarImplJB.java:20)
    at com.walintukai.lfdate.MainActivity.onCreate(MainActivity.java:216)
    at android.app.Activity.performCreate(Activity.java:5133)
    at org.fest.reflect.method.Invoker.invoke(Invoker.java:112)
    at org.robolectric.util.ActivityController$1.run(ActivityController.java:113)
    at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:265)
    at org.robolectric.util.ActivityController.create(ActivityController.java:110)
    at org.robolectric.util.ActivityController.create(ActivityController.java:120)
    at com.walintukai.lfdate.MainActivityTest.setup(MainActivityTest.java:20)
    ... 21 more
like image 548
The Nomad Avatar asked Oct 10 '14 18:10

The Nomad


1 Answers

Create or add a project.properties file to your app directory (not test directory if there are different modules)

add these two lines to newly created file

android.library.reference.1=../../build/intermediates/exploded-aar/com.android.support/appcompat-v7/21.0.3
android.library.reference.2=../../build/intermediates/exploded-aar/com.android.support/support-v4/21.0.3

paths should indicate these references's manifest files

like image 184
Deliganli Avatar answered Oct 22 '22 14:10

Deliganli