Repository: mutexkid/android-studio-robolectric-example Branch: master Commit: 6aedc81ad3cc Files: 22 Total size: 19.0 KB Directory structure: gitextract_g9m4120i/ ├── .gitignore ├── .travis.yml ├── README.md ├── app/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── joshskeen/ │ │ │ └── myapplication/ │ │ │ └── MyActivity.java │ │ └── res/ │ │ ├── layout/ │ │ │ └── activity_my.xml │ │ ├── menu/ │ │ │ └── my.xml │ │ ├── values/ │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── values-w820dp/ │ │ └── dimens.xml │ └── test/ │ └── java/ │ └── com/ │ └── example/ │ └── joshskeen/ │ └── myapplication/ │ └── MyActivityTest.java ├── build.gradle ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ /.gradle /build /out /local.properties /.idea *.iml .DS_Store *.iws *~ *.swp ================================================ FILE: .travis.yml ================================================ language: android jdk: oraclejdk7 android: components: - extra-android-m2repository - build-tools-22.0.1 - android-22 licenses: - android-sdk-license-.+ script: - ./gradlew clean test ================================================ FILE: README.md ================================================ ![build status](https://travis-ci.org/mutexkid/android-studio-robolectric-example.svg) ## Android Studio Robolectric Test Example --- This example project shows how to use robolectric, junit and assertJ with your gradle-based Android Studio projects. Examine the top-level build.gradle and app/build.gradle files for a new project configuration gradle boilerplate. Make sure you're running the most recent version of Android Studio from the Canary Channel for this to work correctly (1.2 Beta as of today). ### To set up from a new Android Studio Project: Add test dependencies on assertj-android and Robolectric to your module's build.gradle file. Your app module's app/build.gradle file would look something like this: ```javascript apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.1" defaultConfig { applicationId "com.example.joshskeen.myapplication" minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' testCompile 'com.squareup.assertj:assertj-android:1.1.0' testCompile 'org.robolectric:robolectric:3.0' } ``` 2. If they don't already exist, create directories matching src/test/java/ and add a package matching your project's packagename. E.g. src/test/java/com.example.joshskeen.myapplication 4. Sync your gradle file by clicking 'Sync Project with Gradle Files' 5. Select "Unit Tests" under "Build Variants" 6. Update default JUnit working directory. Select *Run/Debug Configurations*, then *Defaults*, then *JUnit*, then *Configurations* tab, then *Working directory*, and finally *MODULE_DIR*.: ![default JUnit working directory](readme_images/junit_default_working_dir.png) 5. ctrl + click on the test and select Run MyActivityTest. ![run test menu item](readme_images/run_test.png) 6. Create your unit test in src/test/java/com.example.joshskeen.myapplication/MyActivityTest.java: ```java @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) public class MyActivityTest { private MyActivity mActivity; @Before public void setup() { mActivity = Robolectric.buildActivity(MyActivity.class).create().get(); } @Test public void myActivityAppearsAsExpectedInitially() { assertThat(mActivity.mClickMeButton).hasText("Click me!"); assertThat(mActivity.mHelloWorldTextView).hasText("Hello world!"); } @Test public void clickingClickMeButtonChangesHelloWorldText() { assertThat(mActivity.mHelloWorldTextView).hasText("Hello world!"); mActivity.mClickMeButton.performClick(); assertThat(mActivity.mHelloWorldTextView).hasText("HEY WORLD"); } } ``` Now write Robolectric tests! For more intel on how to write tests using robolectric + assertJ, check out [http://blog.bignerdranch.com/2583-testing-the-android-way/](http://blog.bignerdranch.com/2583-testing-the-android-way/) ================================================ FILE: app/.gitignore ================================================ /build ================================================ FILE: app/build.gradle ================================================ apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.example.joshskeen.myapplication" minSdkVersion 16 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' testCompile 'com.squareup.assertj:assertj-android:1.1.0' testCompile 'org.robolectric:robolectric:3.0' } ================================================ FILE: app/proguard-rules.pro ================================================ # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in /Users/joshskeen/android-sdks/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the proguardFiles # directive in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} ================================================ FILE: app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: app/src/main/java/com/example/joshskeen/myapplication/MyActivity.java ================================================ package com.example.joshskeen.myapplication; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MyActivity extends Activity { Button mClickMeButton; TextView mHelloWorldTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); mHelloWorldTextView = (TextView) findViewById(R.id.helloWorldTextView); mClickMeButton = (Button) findViewById(R.id.clickMeBtn); mClickMeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mHelloWorldTextView.setText("HEY WORLD"); } }); } } ================================================ FILE: app/src/main/res/layout/activity_my.xml ================================================