特定のテストケースでWifiをオン/オフする必要があるUI Androidインストルメンテーションテストを自動化しました。これは簡単なことだと思っていましたが、問題が発生しています。テスト コードのマニフェスト APK でシステム サービスをオン/オフする権限が必要です。テストしているアプリのマニフェストを変更したくありません。
私のテストコードの AndroidManifest.xml は次のとおりです。
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application android:label="UI Tests">
<uses-library android:name="android.test.runner"/>
</application>
<instrumentation android:name="com.mycompany.test.InstrumentationTestRunner"
android:targetPackage="com.mycompany"
android:label="UI Tests"/>
テスト apk がインストールされているのを見ると、実際のデバイスでこれらすべてのアクセス許可が確実に付与されています。
これが、Wifi状態を設定しようとするコードです...
WifiManager wifi = (WifiManager) getInstrumentation().getContext().getSystemService(Context.WIFI_SERVICE);
if ((!wifiEnabled) && (wifi.getWifiState() != WifiManager.WIFI_STATE_DISABLED)){
mTestLogger.logMsg("Turning off wifi");
wifi.setWifiEnabled(false);
sleep(3000);
}
このコードは正しいと思いました。getInstrumenation().getContext() は、テスト コードの apk のコンテキストです。ただし、wifi.setWifiEnabled(false) の行にヒットすると、例外がスローされます。
java.lang.SecurityException: WifiService: ユーザー 10145 も現在のプロセスも android.permission.CHANGE_WIFI_STATE を持っていません。
私が何を間違えたのか分かりますか?マニフェストには明らかに CHANGE_WIFI_STATE があり、デバイスで権限が正しく設定されていることを確認しました。
私は間違った文脈を持っているに違いありません。getInstrumentation().getContext().getApplicationInfo() は、テスト apk の正しい情報を提供してくれます。だから私には正しいように見えます。