在Firebase上运行Espresso测试时出现NoClassDefFoundError

问题描述 投票:3回答:1

我有一套仪器测试,可以在Android 4.4到8的各种物理设备上使用Firebase测试实验室运行。

我可以在任何操作系统版本以及Firebase测试实验室中的新设备上本地运行这些测试,但是当我在运行4.4的设备上运行Firebase测试实验室中的这些测试时(当前在Moto X和Galaxy S4 Mini上运行) ),报告了一个例外,即使各个测试用例都报告成功。这是我看到的例外情况:

java.lang.NoClassDefFoundError: org.junit.internal.TextListener FATAL EXCEPTION: Instr: android.support.test.runner.AndroidJUnitRunner Process: today.onedrop.android.debug, PID: 5579 java.lang.NoClassDefFoundError: org.junit.internal.TextListener
    at android.support.test.internal.runner.listener.InstrumentationResultPrinter.instrumentationRunFinished(InstrumentationResultPrinter.java:221)
    at android.support.test.internal.runner.TestExecutor.reportRunEnded(TestExecutor.java:92)
    at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:67)  
    at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375)  
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1792)

我怀疑Firebase实际上不是一个因素,如果我有一个Moto X或Galaxy S4 Mini在本地进行测试,这些测试会以同样的方式失败。不幸的是我无法测试这个理论。

更新我的Espresso测试以使用TestOrchestrator后,我开始在Android 4.4本地AVD上获得NoClassDefFoundError。它与上述不同:

FATAL EXCEPTION: Instr: android.support.test.runner.AndroidJUnitRunner
Process: today.onedrop.android.debug, PID: 15683
java.lang.NoClassDefFoundError: org.junit.runner.Request
    at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:353)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)

在Firebase上使用TestOrchestrator会产生新错误,而不是旧错误。这是任何人猜测他们是否有相同的根本原因,但他们的相似之处肯定似乎是可疑的。

更新#2

@ MartinZeitler关于MultiDex的直觉似乎是正确的。我已经解决了 第二个NoClassDefFoundError 通过在我的gradle配置中将缺少的类添加到multidex keep file来解决这两个问题:

multiDexKeepFile file('multidex-config.txt')

multidex-的config.txt:

org/junit/runner/Request.class
org/junit/internal/TextListener.class

似乎4.4上的multidex需要一些帮助。或许这只是一个黑客,只会导致与其他缺少类的随机崩溃。无论如何一切都在恢复!

android firebase android-espresso android-multidex firebase-test-lab
1个回答
2
投票

你有没有为jUnit添加一个依赖?即使在Android的旧版本上,该库类也应该是已知的...导致假设您可能还需要在multiDexEnabled true中设置build.gradle,以构建Android <API 22(默认情况下在所有后续API上启用) 。

dependencies {
    testImplementation 'junit:junit:4.12'
}

gcloud firebase test android models list列出设备......

┌───────────────────┬──────────┬─────────────────────────────────────┬──────────┬─────────────┬────────────────┬────────────┐
│      MODEL_ID     │   MAKE   │              MODEL_NAME             │   FORM   │  RESOLUTION │ OS_VERSION_IDS │    TAGS    │
├───────────────────┼──────────┼─────────────────────────────────────┼──────────┼─────────────┼────────────────┼────────────┤
│ serranolte        │ Samsung  │ Galaxy S4 mini                      │ PHYSICAL │  960 x 540  │ 19             │            │
│ victara           │ Motorola │ Moto X                              │ PHYSICAL │ 1920 x 1080 │ 19             │            │
└───────────────────┴──────────┴─────────────────────────────────────┴──────────┴─────────────┴────────────────┴────────────┘

gcloud firebase test android models describe serranolte

brand: Samsung
codename: serranolte
form: PHYSICAL
supportedVersionIds:
- '19'

gcloud firebase test android models describe victara

brand: Motorola
codename: victara
form: PHYSICAL
supportedVersionIds:
- '19'

它是两种硬件设备。

© www.soinside.com 2019 - 2024. All rights reserved.