I have one device that throws an exception when I try to run unit tests on a project recently converted to use the androidX support libraries. The tests have run on emulators and other physical devices.
The device it will not run on is a Pixel 2 running 9.
App crashes with this exception:
AndroidRuntime: FATAL EXCEPTION: main
AndroidRuntime: PID: 7050
AndroidRuntime: java.lang.IllegalStateException: Call to getContentProviderExternal for: android_support_test_services.speak_easy returns null!
AndroidRuntime: at androidx.test.services.speakeasy.client.ToolConnection$ToolConnectionPostIcs.doCall(ToolConnection.java:155)
AndroidRuntime: at androidx.test.services.speakeasy.client.ToolConnection.publish(ToolConnection.java:93)
AndroidRuntime: at androidx.test.services.speakeasy.client.ToolConnection.publish(ToolConnection.java:83)
AndroidRuntime: at androidx.test.services.shellexecutor.BlockingPublish.getResult(BlockingPublish.java:79)
AndroidRuntime: at androidx.test.services.shellexecutor.ShellCommandExecutorServer.start(ShellCommandExecutorServer.java:80)
AndroidRuntime: at androidx.test.services.shellexecutor.ShellMain.main(ShellMain.java:45)
AndroidRuntime: at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
AndroidRuntime: at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:340)
AndroidRuntime: Error reporting crash
AndroidRuntime: java.lang.RuntimeException: Bad file descriptor
AndroidRuntime: at android.os.BinderProxy.transactNative(Native Method)
AndroidRuntime: at android.os.BinderProxy.transact(Binder.java:1127)
AndroidRuntime: at android.app.IActivityManager$Stub$Proxy.handleApplicationCrash(IActivityManager.java:3711)
AndroidRuntime: at com.android.internal.os.RuntimeInit$KillApplicationHandler.uncaughtException(RuntimeInit.java:143)
AndroidRuntime: at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068)
AndroidRuntime: at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1063)
AndroidRuntime: at java.lang.Thread.dispatchUncaughtException(Thread.java:1955)
Simplified Unit Test:
import androidx.test.rule.ActivityTestRule
import org.junit.Assert
import org.junit.Rule
import org.junit.Test
class MyTest {
@Rule
var activityTestRule: ActivityTestRule<AuthAppActivity> = object : ActivityTestRule<AuthAppActivity>(AuthAppActivity::class.java, false, false) {
override fun afterActivityLaunched() {
}
override fun beforeActivityLaunched() {
}
}
@Test
fun runTest() {
Assert.assertTrue(true); // low standards here
}
}
And the relevant dependencies:
testImplementation('junit:junit:4.12') {
exclude group: 'org.hamcrest', module: 'hamcrest-core'
}
testImplementation 'org.hamcrest:hamcrest-library:1.3'
androidTestImplementation "androidx.annotation:annotation:1.0.0"
androidTestImplementation "androidx.test:runner:1.1.0"
androidTestImplementation "androidx.test:rules:1.1.0"
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
androidTestImplementation "androidx.test.espresso:espresso-core:3.1.0"
androidTestImplementation "androidx.test.espresso:espresso-idling-resource:3.1.0"
androidTestImplementation "androidx.test.espresso:espresso-contrib:3.1.0"
androidTestImplementation "androidx.test.espresso:espresso-web:3.1.0"
androidTestImplementation "androidx.test.espresso:espresso-intents:3.1.0"
The provider android_support_test_services.speak_easy is obviously missing from the device. I ran the test on the working device and see that the same provider is used and found on that device. I pulled up an older branch, prior to AndroidX, ran the a instrumented test from there and then switched back, the error was gone.
Older version installed these versions:
test-services-1.0.2.apk
orchestrator-1.0.2.apk
Newer androidx:
orchestrator-1.1.0-alpha3.apk
test-services-1.1.0-alpha3.apk
我终于意识到我使用了旧版本的Test Orchestrator 链接后终于解决了这个问题,尽管我将所有其他测试包都更新为androidx.test
,但我不小心依赖于旧的android.support.test
版本,而不是androidx.test
版本。 。测试。
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.