Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

getSupportActionBar() returns null with Robolectric

The method getSupportActionBar() returns null when i invoke it through a Test Case based in Roboelectric and JUnit.

This is my simple test case:

package com.mobile.test;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import android.app.Activity;
import android.content.Intent;
import com.mobile.android.core.R;
import com.mobile.android.core.activity.MainActivity;
import com.mobile.android.core.activity.TestActivity;

@RunWith(RobolectricTestRunner.class)
public class NavigationDrawerTest {
private Activity activity;

@Test
public void testNavigationDrawer() {
    activity = Robolectric.buildActivity(MainActivity.class).create().get();
    String hello = activity.getResources().getString(R.string.drawer_open);
    System.out.println(hello);
    assertEquals(hello, "Menu");
}
}

And this is my Activity class:

public class MainActivity extends ActionBarActivity {
// Drawer related
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
String[] mDrawerOptions;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // enable ActionBar app icon to behave as action to toggle nav-drawer
    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
    }
}
}

Any bright ideas on hwo to fix this?? DO i have to write some shadow activity or does anyone knows how to work with these action bar problems with RObolectric??

Thanks for any help

like image 393
revolutionary Avatar asked Aug 01 '13 11:08

revolutionary


1 Answers

Support ActionBar
I was able to get back an instance of the Support ActionBar by adding a @Config annotation to my test with the Gingerbread sdk build number:

@Test @Config(reportSdk = 10)
public void actionbarTest(){
.... Your Test here
}

A simple project setup can be seen here: simple-robolectric



ActionBarSherlock
You have to add modified ActionBarSherlock files to your test package and call the following methods in your @Before method:

ActionBarSherlock.registerImplementation(ActionBarSherlockRobolectric.class);
ActionBarSherlock.unregisterImplementation(ActionBarSherlockNative.class);
ActionBarSherlock.unregisterImplementation(ActionBarSherlockCompat.class);

The full set of instructions can be found here: ActionBar and Robolectric working together

Update
With Robolectric 2.2 you only have to add the config annotation "@Config(reportSdk = 10)" to your test methods or class and it should work as well.

like image 172
Marco RS Avatar answered Oct 19 '22 03:10

Marco RS