RobolectricがAndroidManifest.xmlで問題を抱えているという問題が発生しています。私のアプリは正常に動作しますが、RobolectricはassertTrue(true)
も含めてすべてのテストに失敗しています。エラーは次のとおりです。
Android.view.InflateException: XML file /[blah]/build/res/all/debug/layout/activity_main.xml line #-1 (sorry, not yet implemented): Error inflating class fragment
のせいで:
Java.lang.IllegalStateException: The meta-data tag in your app's AndroidManifest.xml does not have the right value. Expected 4030500 but found 0. You must have the following declaration within the <application> element: <meta-data Android:name="com.google.Android.gms.version" Android:value="@integer/google_play_services_version" />
問題は、マニフェストにすでにその行があることです。以下は、関連するファイルの一部です。
AndroidManifest.xml:
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.bryansills.studywithfriends"
Android:versionCode="1"
Android:versionName="1.0">
<uses-sdk
Android:minSdkVersion="14"
Android:targetSdkVersion="18"/>
<uses-permission Android:name="Android.permission.INTERNET"/>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission Android:name="com.google.Android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
<uses-feature
Android:glEsVersion="0x00020000"
Android:required="true"/>
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:logo="@drawable/ic_action_icon"
Android:label="@string/app_name"
Android:theme="@style/study">
<activity
Android:name="com.bryansills.studywithfriends.MainActivity"
Android:label="@string/app_name">
<intent-filter>
<action Android:name="Android.intent.action.MAIN"/>
<category Android:name="Android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<meta-data
Android:name="com.google.Android.maps.v2.API_KEY"
Android:value="@string/google_maps_api_key_v2"/>
<meta-data
Android:name="com.google.Android.gms.version"
Android:value="@integer/google_play_services_version"/>
</application>
</manifest>
build.gradle:
buildscript {
repositories {
mavenCentral()
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
}
dependencies {
classpath 'com.Android.tools.build:gradle:0.7.+'
classpath 'com.squareup.gradle:gradle-Android-test-plugin:0.9.1-SNAPSHOT'
}
}
apply plugin: 'Android'
apply plugin: 'Android-test'
repositories {
mavenCentral()
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
}
Android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
defaultConfig {
minSdkVersion 14
targetSdkVersion 18
}
}
dependencies {
compile 'com.Android.support:support-v4:+'
compile 'com.google.Android.gms:play-services:4.0.+'
testCompile 'junit:junit:4.11'
testCompile 'org.robolectric:robolectric:2.3-SNAPSHOT'
testCompile 'com.squareup:fest-Android:1.0.+'
}
MainActivityTest.Java:
package com.bryansills.studywithfriends;
import Android.app.Activity;
import Android.content.Intent;
import Android.graphics.drawable.Drawable;
import Android.support.v4.app.ActionBarDrawerToggle;
import Android.support.v4.widget.DrawerLayout;
import Android.view.ActionProvider;
import Android.view.ContextMenu;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.SubMenu;
import Android.view.View;
import com.bryansills.studywithfriends.MainActivity;
import dalvik.annotation.TestTargetClass;
import org.junit.Test;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.shadows.ShadowToast;
import org.robolectric.tester.Android.view.TestMenuItem;
import com.bryansills.studywithfriends.RobolectricGradleTestRunner;
import Java.lang.*;
import Java.lang.CharSequence;
import Java.lang.Exception;
import Java.lang.Override;
import Java.lang.System;
import static org.junit.Assert.assertTrue;
@RunWith(RobolectricGradleTestRunner.class)
public class MainActivityTest {
private MainActivity mainActivity;
private DrawerLayout drawer;
private MenuItem settingsMenuItem;
private MenuItem helpMenuItem;
@Before
public void setUp() throws Exception {
mainActivity = Robolectric.buildActivity(MainActivity.class).create().visible().get();
drawer = (DrawerLayout) mainActivity.findViewById(R.id.drawer);
settingsMenuItem = new TestMenuItem(R.id.settings);
helpMenuItem = new TestMenuItem(R.id.help);
}
@Test
public void testTrue() throws Exception {
assertTrue(true);
}
@Test
public void testActivity() throws Exception {
assertTrue(mainActivity != null);
}
@Test
public void settingsMenuItemShouldStartSettingsActivity() throws Exception {
mainActivity.onOptionsItemSelected(settingsMenuItem);
assertTrue(ShadowToast.getTextOfLatestToast().equals("Settings"));
}
@Test
public void helpMenuItemShouldStartSettingsActivity() throws Exception {
mainActivity.onOptionsItemSelected(helpMenuItem);
assertTrue(ShadowToast.getTextOfLatestToast().equals("Help"));
}
}
注:ここ で作成した後、まずマニフェストにApiキーを追加してください。
マニフェストから古いスタイルのpermission
を削除します。存在する場合は、指定された権限を削除します。
<permission Android:name ="com.example.locations.permission.MAPS_RECEIVE" Android:protectionLevel="signature"></permission>
Google Map V2は、マニフェストに新しい機能を追加します。指定されたコードをマニフェストに追加します。
<meta-data
Android:name="com.google.Android.gms.version"
Android:value="@integer/google_play_services_version" />// if this integer is not showing Add latest google play services
その上
<meta-data
Android:name="com.google.Android.maps.v2.API_KEY"
Android:value="ENTER_YOUR_API_KEY_HERE" />
manifest
にAPIキーを入力することを忘れないでください。
これも削除してください。
<uses-permission Android:name="com.google.Android.providers.gsf.permission.READ_GSERVICES"/>
これは、Robolectric 2.1から2.3-SNAPSHOTにアップグレードすることで修正されました(2.2はテストしていません)。しかし、その後、別の問題が発生しました。
Java.lang.IllegalStateException:アプリのAndroidManifest.xmlのメタデータタグに正しい値がありません。 4030500が必要ですが、2131361793が見つかりました。要素内に次の宣言が必要です:<meta-data Android:name = "com.google.Android.gms.version" Android:value = "@ integer/google_play_services_version" />
これは 別のバグ のようです。これは、GMSバージョンを参照するのではなく、マニフェストにハードコーディングすることで「修正」しました。これはおそらく良い考えではありませんが、バグが修正されるまでは機能します...
AndroidManifest.xml
に以下を追加する必要があります。
<application>
<meta-data
Android:name="com.google.Android.gms.version"
Android:value="@integer/google_play_services_version" />
</application>