Robolectric Survival Guide
eBuddy
• 2009 Chat (IM)
• 2011 XMS
• 2012 We started with Robolectric




ANDROID PRODUCTS HISTORY
Android!
Relationships
•   Java
•   Maven
•   Android
•   Unit tests
First Android JUnit Test
import org.junit.Before;
import org.junit.Test;
import static org.fest.assertions.api.Assertions.assertThat;

public class MainActivityTest {
   private MainActivity activity;

    @Before public void setUp () throws Exception
    {
        activity = new MainActivity();
        activity.onCreate( null );
    }

    @Test public void checkInitialTexts () throws Exception
    {
        assertThat( activity.downloadButton.getText() ).isEqualTo( "Download" );
    }
}
First Android JUnit Test
Android Testing Options
•   No tests
•   POJO
•   Instrumental tests
•   Android sources
•   Mock Android
•   Robolectric!
What is inside
• Parses resources
• Intercepts loading Android
  classes
• Rewrites method bodies
  with Javassist
• Binds shadow objects to
  new Android objects
• Proxies modified objects
First Robolectric Test
Key Points from Demo #1
• Correct path to SDK in the
  local.properties
• JUnit dependency before
  Android (IntelliJ IDEA)
• @RunWith(
  RobolectricTestRunner.class)
Biggest Issue of Robolectric

 •   Lack of documentation
 •   Not many examples
 •   Unscheduled releases
 •   http://robolectric.blogspot.nl/
     2011/02/how-to-work-on-
     robolectric-in-parallel.html
Robolectric Drawbacks
• Sometimes magic
• PowerMock integration
• Time of run for the first test
Shadowing
• http://robolectric.blogspot.nl/2
  011/01/how-to-create-your-
  own-shadow-classes.html
• Bind shadow class
• Use own Runner instead of
  Robolectric
• (Submit pull request)
Dependency Injection
RoboGuice 2.0

public class MainActivity extends RoboActivity implements View.OnClickListener
{
    @Inject Bus bus;

    @Override public void onCreate( Bundle savedInstanceState )
    {
        bus.register( this );
    }

    @Override public void onClick( View view )
    {
        bus.post( new DownloadDataEvent( urlInput.getText().toString() ) );
    }
}
RoboGuice 2.0
Key Points from Demo #2
• InjectingTestRunner
• Own AbstractModule
  implementation
• Run injections before
  every test method
Android Real Jar (Robolectric 2.0)
• http://robolectric.blogspot.nl
  /2011/08/using-robolectric-
  with-real-android.html
• Robolectric 2.0 alpha
Robolectric or not Robolectric
• Not a question for me
• Follow industry
Thank you!

Robolectric Adventure

  • 1.
  • 2.
    eBuddy • 2009 Chat(IM) • 2011 XMS • 2012 We started with Robolectric ANDROID PRODUCTS HISTORY
  • 3.
  • 4.
    Relationships • Java • Maven • Android • Unit tests
  • 5.
    First Android JUnitTest import org.junit.Before; import org.junit.Test; import static org.fest.assertions.api.Assertions.assertThat; public class MainActivityTest { private MainActivity activity; @Before public void setUp () throws Exception { activity = new MainActivity(); activity.onCreate( null ); } @Test public void checkInitialTexts () throws Exception { assertThat( activity.downloadButton.getText() ).isEqualTo( "Download" ); } }
  • 6.
  • 7.
    Android Testing Options • No tests • POJO • Instrumental tests • Android sources • Mock Android • Robolectric!
  • 8.
    What is inside •Parses resources • Intercepts loading Android classes • Rewrites method bodies with Javassist • Binds shadow objects to new Android objects • Proxies modified objects
  • 9.
  • 10.
    Key Points fromDemo #1 • Correct path to SDK in the local.properties • JUnit dependency before Android (IntelliJ IDEA) • @RunWith( RobolectricTestRunner.class)
  • 11.
    Biggest Issue ofRobolectric • Lack of documentation • Not many examples • Unscheduled releases • http://robolectric.blogspot.nl/ 2011/02/how-to-work-on- robolectric-in-parallel.html
  • 12.
    Robolectric Drawbacks • Sometimesmagic • PowerMock integration • Time of run for the first test
  • 13.
    Shadowing • http://robolectric.blogspot.nl/2 011/01/how-to-create-your- own-shadow-classes.html • Bind shadow class • Use own Runner instead of Robolectric • (Submit pull request)
  • 14.
  • 15.
    RoboGuice 2.0 public classMainActivity extends RoboActivity implements View.OnClickListener { @Inject Bus bus; @Override public void onCreate( Bundle savedInstanceState ) { bus.register( this ); } @Override public void onClick( View view ) { bus.post( new DownloadDataEvent( urlInput.getText().toString() ) ); } }
  • 16.
  • 17.
    Key Points fromDemo #2 • InjectingTestRunner • Own AbstractModule implementation • Run injections before every test method
  • 18.
    Android Real Jar(Robolectric 2.0) • http://robolectric.blogspot.nl /2011/08/using-robolectric- with-real-android.html • Robolectric 2.0 alpha
  • 19.
    Robolectric or notRobolectric • Not a question for me • Follow industry
  • 20.