Cannot find parent for StyleData when using Robolectric in Android Studio with AppCompat

I have an Android project that uses:

  • Android Studio Gradle Structure
  • Android AppCompat Library
  • Robolectric for testing

Testing without the participation of any Activity (for example, only statement 1 == 1) works fine. But when using activity, the following error is created:

java.lang.RuntimeException: huh? can't find parent for StyleData{name='Theme_Sanactbar', parent='@style/Theme_AppCompat_Light_DarkActionBar'} at org.robolectric.shadows.ShadowAssetManager$StyleResolver.getParent(ShadowAssetManager.java:365) at org.robolectric.shadows.ShadowAssetManager$StyleResolver.getAttrValue(ShadowAssetManager.java:350) 

I tried https://github.com/robolectric/robolectric/issues/979 but it creates the same result.


FYI:

This is my PROJECT / build.gradle

 // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { mavenCentral() // For Robolectric maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } maven { url 'https://github.com/rockerhieu/mvn-repo/raw/master/' } } dependencies { classpath 'com.android.tools.build:gradle:0.11.+' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.2+' classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.10.1-SNAPSHOT' } } allprojects { repositories { mavenCentral() // For Robolectric maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } } } 

And this is my PROJECT / app / build.gradle

 apply plugin: 'android' apply plugin: 'android-apt' apply plugin: 'android-test' // Robolectric repositories { mavenLocal() } android { compileSdkVersion 19 buildToolsVersion "19.1.0" defaultConfig { applicationId "id.web.michsan.helloworld" minSdkVersion 8 targetSdkVersion 19 versionCode 6 versionName "1.1.1" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } if (System.getenv("KEYSTORE") != null) { signingConfigs { release { storeFile file(System.getenv("KEYSTORE")) storePassword System.getenv("KEYSTORE_PASSWORD") keyAlias System.getenv("KEY_ALIAS") keyPassword System.getenv("KEY_PASSWORD") } } } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' if (System.getenv("KEYSTORE") != null) { signingConfig signingConfigs.release } } } /* For the sake of butterknife */ lintOptions { disable 'InvalidPackage' } sourceSets { androidTest.setRoot('src/test') // For Robolectric } } ext { androidApiVersion = '19.1.0' butterknifeVersion = '4.0.1' robotiumVersion = '5.0.1' } dependencies { compile 'com.android.support:appcompat-v7:' + androidApiVersion compile 'com.android.support:support-v4:' + androidApiVersion compile fileTree(dir: 'libs', include: ['*.jar']) compile(project(':core')) { exclude group: 'org.apache.httpcomponents' exclude group: 'org.json' } compile fileTree(dir: '../core/libs', include: ['*.jar']) apt 'com.jakewharton:butterknife:' + butterknifeVersion compile 'com.jakewharton:butterknife:' + butterknifeVersion androidTestCompile 'com.jayway.android.robotium:robotium-solo:' + robotiumVersion // For Robolectric androidTestCompile 'junit:junit:4.11' androidTestCompile 'org.robolectric:robolectric:2.3' compile 'com.mopub.mobileads:mopub-android: +@aar ' } // Robolectric: Add this definition in order to only include files that are suffixed with Test.class and set the max heap size androidTest { include '**/*Test.class' maxHeapSize = "2048m" } 
+7
android-gradle robolectric android-testing
source share
2 answers

After debugging the Robolectric source, I know that I need to create the project.properties file.

Assuming you are using the Android Studio project structure, the location of the PROJECT_X/app/src/main/project.properties file

Content

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

This is because Robolectric AndroidManifest.getBaseDir() gives you /path/into/AndroidStudioProjects/PROJECT_X/app/src/main .

So, this base directory is added with a reference location. In this case, I can guarantee that /path/into/AndroidStudioProjects/PROJECT_X/app/src/main + /../../../build/intermediates/exploded-aar/com.android.support/appcompat-v7/19.1.0 provides me with a directory containing the AndroidManifest.xml of the appcompat library.

+12
source share

For me it was necessary to upgrade to roboletric:2.4-SNAPSHOT and make sure that you have a test class in the same package as the test class.

Also my test class needs this annotation for configuration:

 @Config(emulateSdk = 18, reportSdk = 18) 

I do not need the project.properties file

 dependencies { repositories { maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } } androidTestCompile('org.robolectric:robolectric:2.4-SNAPSHOT') { //excludes here } } 

In addition, I had to make sure that I had the following task in gradle to avoid validation errors (only for semi-communication)

 /** * Fixes: https://github.com/robolectric/robolectric/issues/1186 * Java 7 and 8 have strict compiler verification, this doesn't apply to Android * Our error was related to AppCompat not Play Svcs, but it was the same error */ tasks.whenTaskAdded { theTask -> def taskName = theTask.name.toString() if ("testDebug".toString().equals(taskName)) { /** * Listen for when robolectric adds the 'testDebug' task and when it does, add the -noverify * option to that task jvmArgs. This allows us to turn off byte code verification when * running our unit tests. */ theTask.jvmArgs('-noverify') } } 
0
source share

All Articles