2016-07-26 21 views
2

失敗,這是問題的配方:用於測試使用亞行資助ACCESS_MOCK_LOCATION許可,棉花糖

  1. 添加模擬位置的權限在調試清單<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
  2. 安裝在手機應用程序的調試版本(在搖籃:debug { debuggable true }
  3. 儘量給許可與亞行:adb shell pm grant com.myapp.name android.permission.ACCESS_MOCK_LOCATION

命令的結果是:

不允許操作:java.lang.SecurityException異常:權限android.permission.ACCESS_MOCK_LOCATION是不是一個多變的許可類型」

如果我去開發商選擇在手機上,並設置Setting >> Developer Option >> Select Mock location app它的工作原理。因爲它是在應用程序的每一個安裝復位

我需要這個自動化測試,所以很明顯的將手機設置的選項是無效的,所以我需要亞行選項來運行。

回答

4

我發現這個同樣的問題葫蘆修復裏面的解決方案: https://github.com/calabash/calabash-android/commit/b31be97953325383b9295ff52234a0121cc27e27

adb shell appops set com.myapp.name 58 allow 

從gradle這個自動做到這一點,你可以在命令添加到安裝任務:

def adb = android.getAdbExe().toString() 
tasks.whenTaskAdded { task -> 
    if (task.name.startsWith('install')) { 
     task.doLast { 
      android.applicationVariants.all { variant -> 
       "${adb} devices".execute().text.eachLine { 
        if (it.endsWith("device")) { 
         def device = it.split()[0] 
         println "Granting test permissions on device ${device}\n" 
         "${adb} shell appops set ${variant.applicationId} 58 allow".execute() 
        } 
       } 
      } 
     } 
    } 
} 

但你必須顯式調用的connectedTest任務之前安裝任務,如:

gradlew installMyAppDebug connectedMyAppDebugAndroidTest 
0

或者,你可以使用測試巴特勒插件來管理除其他事項外測試權限https://github.com/linkedin/test-butler

示例項目我配置的位置和使用測試巴特勒:https://github.com/sebaslogen/Blendletje/

public class TestRunner extends AndroidJUnitRunner { 
    @Override 
    public void onStart() { 
     TestButler.setup(InstrumentationRegistry.getTargetContext()); 
     super.onStart(); 
    } 

    @Override 
    public void finish(final int resultCode, final Bundle results) { 
     TestButler.teardown(InstrumentationRegistry.getTargetContext()); 
     super.finish(resultCode, results); 
    } 
} 
@Before 
public void setUp() throws Exception { 
    final Context targetContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 
    TestButler.verifyAnimationsDisabled(targetContext); 
} 

你可以看到它是如何自動安裝運行時檢查:https://github.com/sebaslogen/Blendletje/blob/master/app/build.gradle#L107