Android棒棒糖Appcompat问题与Robolectric运行

自从Android Lollipop发布以来,使用新的Appcompat支持库时,我无法运行Robolectictesting。 我遵循:

我目前的进度可以在这里find: https : //github.com/fada21/android-tdd-bootstrap

我的configuration(蒸馏)是:

android { compileSdkVersion 21 buildToolsVersion "21.0.1" defaultConfig { applicationId "com.fada21.android.bootstrap" minSdkVersion 15 targetSdkVersion 21 

 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:support-v4:21.0.0' compile 'com.android.support:appcompat-v7:21.0.0' 

 androidTestCompile('org.robolectric:robolectric:2.4-SNAPSHOT') { 

我在这里提出了一个问题: https : //github.com/robolectric/robolectric/issues/1332 (看这里的更多细节)。

这是我得到的错误:

 java.lang.RuntimeException: Could not find any resource from reference ResName{com.fada21.android.bootstrap:style/Theme_AppCompat_Light_NoActionBar} from style StyleData{name='AppTheme', parent='Theme_AppCompat_Light_NoActionBar'} with theme null at org.robolectric.shadows.ShadowAssetManager$StyleResolver.getParent(ShadowAssetManager.java:456) at org.robolectric.shadows.ShadowAssetManager$StyleResolver.getAttrValue(ShadowAssetManager.java:394) at org.robolectric.shadows.ShadowResources.getOverlayedThemeValue(ShadowResources.java:297) at org.robolectric.shadows.ShadowResources.findAttributeValue(ShadowResources.java:286) at org.robolectric.shadows.ShadowResources.attrsToTypedArray(ShadowResources.java:189) at org.robolectric.shadows.ShadowResources.access$000(ShadowResources.java:48) at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:494) at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:489) at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:484) at android.content.res.Resources$Theme.obtainStyledAttributes(Resources.java) at android.content.Context.obtainStyledAttributes(Context.java:380) at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:143) at android.support.v7.app.ActionBarActivityDelegateBase.onCreate(ActionBarActivityDelegateBase.java:139) at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:123) at com.fada21.android.bootstrap.HomeActivity.onCreate(HomeActivity.java:28) 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.fada21.android.bootstrap.HomeActivityTest.testActivityNotNull(HomeActivityTest.java:24) 

Solutions Collecting From Web of "Android棒棒糖Appcompat问题与Robolectric运行"

:截至7/7/15, Roboelectric 3.0已经发布。 它解决了问题,使这个答案不再是必要的。

老答案:

在Robolectric 3.0发布之前,这里有一个解决scheme。

 #/app/src/main/res/values/styles.xml <resources> //<!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> //<!-- Customize your theme here. --> </style> //<!-- Hack for Robolectric to run with appcompat.v7 --> <style name="RoboAppTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar"> //<!-- Customize your theme here. --> </style> </resources> 

然后调整您的自定义RobolectricRunner类

 public class MyRobolectricTestRunner extends RobolectricTestRunner { private static final int MAX_SDK_SUPPORTED_BY_ROBOLECTRIC = 18; public MyRobolectricTestRunner(Class<?> testClass) throws InitializationError { super(testClass); } @Override protected AndroidManifest getAppManifest(Config config) { String manifestProperty = "../app/src/main/AndroidManifest.xml"; String resProperty = "../app/src/main/res"; return new AndroidManifest(Fs.fileFromPath(manifestProperty), Fs.fileFromPath(resProperty)) { @Override public int getTargetSdkVersion() { return MAX_SDK_SUPPORTED_BY_ROBOLECTRIC; } @Override public String getThemeRef(Class<? extends Activity> activityClass) { return "@style/RoboAppTheme"; } }; } } 

基本上我们只是告诉JVM使用不同的应用程序主题。 然后像使用@RunWith(MyRobolectricTestRunner.class)一样使用这个TestRunner。

注意:这涉及仅extend Activity ,对于extend ActionBarActivity活动,会出现相同types的其他问题

编辑:截至2015年7月4日,Robolectric 3.0快照构build可用于占用ActionBarActivity 。 更多信息可在评论中的链接中find

添加一个与清单相同的hierarki级别的project.properties文件,内容如下:

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

确保appcompat版本与您的gradle文件相同。

使用这个自定义RobolectricTestRunner修复了一个类似的问题,我有。 这也意味着你在每个testing中都不需要@Config(emulateSdk = 18)。

replace:@RunWith(RobolectricTestRunner.class)

与:@RunWith(MyRobolectricTestRunner.class)在你所有的Robolectrictesting

 public class MyRobolectricTestRunner extends RobolectricTestRunner { public MyRobolectricTestRunner(Class<?> testClass) throws InitializationError { super(testClass); } @Override protected AndroidManifest getAppManifest(Config config) { String manifestProperty = System.getProperty("android.manifest"); if (config.manifest().equals(Config.DEFAULT) && manifestProperty != null) { String resProperty = System.getProperty("android.resources"); String assetsProperty = System.getProperty("android.assets"); CustomAndroidManifest androidManifest = new CustomAndroidManifest( Fs.fileFromPath(manifestProperty), Fs.fileFromPath(resProperty), Fs.fileFromPath(assetsProperty)); androidManifest.setPackageName("com.justyoyo"); return androidManifest; } return super.getAppManifest(config); } private static class CustomAndroidManifest extends AndroidManifest { private static final int MAX_SDK_SUPPORTED_BY_ROBOLECTRIC = 18; public CustomAndroidManifest(FsFile androidManifestFile, FsFile resDirectory, FsFile assetsDirectory) { super(androidManifestFile, resDirectory, assetsDirectory); } @Override public int getTargetSdkVersion() { return MAX_SDK_SUPPORTED_BY_ROBOLECTRIC; } } } 

请记住: https : //github.com/robolectric/robolectric/issues/1025

一些解决scheme可能是:

jointesting:
@Config(emulateSdk = 18,reportSdk = 18)

并使其如下所示:

 @RunWith(RobolectricTestRunner.class) @Config(emulateSdk = 18, reportSdk = 18) public class YourClassTestNameTest {… 
 @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) 

解决了我的问题。