![](/img/trans.png)
[英]Android: How to capture or display logging output when running gradle connectedCheck
[英]NoClassDefFoundError when running Gradle connectedCheck on AVD emulator
我正在嘗試為Android應用運行Espresso測試。 它在硬件設備上運行良好。 當我在新創建的AVD模擬器上運行它時,它會失敗 ,如下所示:
:ExampleApp:connectedDebugAndroidTest
com.example.MainFragmentTest > initializationError[Nexus_5_API_19(AVD) - 4.4.2]
FAILED
java.lang.NoClassDefFoundError: com/example/MainActivity
at java.lang.Class.getDeclaredFields(Native Method)
:ExampleApp:connectedDebugAndroidTest FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':ExampleApp:connectedDebugAndroidTest'.
> There were failing tests. See the report at:
file:///home/user/work/ExampleApp/build/reports/androidTests/connected/index.html
HTML報告包含以下堆棧跟蹤:
java.lang.NoClassDefFoundError: com/example/MainActivity
at java.lang.Class.getDeclaredFields(Native Method)
at java.lang.Class.getDeclaredFields(Class.java:610)
at org.junit.runners.model.TestClass.getSortedDeclaredFields(TestClass.java:77)
at org.junit.runners.model.TestClass.scanAnnotatedMembers(TestClass.java:70)
at org.junit.runners.model.TestClass.<init>(TestClass.java:57)
at org.junit.runners.ParentRunner.createTestClass(ParentRunner.java:88)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:83)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
at android.support.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:38)
at android.support.test.runner.AndroidJUnit4.<init>(AndroidJUnit4.java:36)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.buildAndroidRunner(AndroidAnnotatedBuilder.java:57)
at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.runnerForClass(AndroidAnnotatedBuilder.java:45)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runner.Computer.getRunner(Computer.java:40)
at org.junit.runner.Computer$1.runnerForClass(Computer.java:31)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:101)
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:87)
at org.junit.runners.Suite.<init>(Suite.java:81)
at org.junit.runner.Computer.getSuite(Computer.java:28)
at android.support.test.internal.runner.TestRequestBuilder.classes(TestRequestBuilder.java:701)
at android.support.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:664)
at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:329)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:226)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)
Caused by: java.lang.ClassNotFoundException: Didn't find class
"com.example.MainActivity" on path: DexPathList[[zip file
"/system/framework/android.test.runner.jar", zip file
"/data/app/com.example.debug.test-1.apk", zip file
"/data/app/com.example.debug-1.apk"],
nativeLibraryDirectories=[/data/app-lib/com.example.debug.test-1,
/data/app-lib/com.example.debug-1, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
... 28 more
我基本上遵循espresso / BasicSample / ChangeTextBehaviorTest.java中的結構。 此測試適用於模擬器!
對於我的測試,我可以把它歸結為當我使用以下代碼時運行測試已經失敗 :
@RunWith(AndroidJUnit4.class)
public class MainFragmentTest {
@Rule
public ActivityTestRule<MainActivity> mActivityRule =
new ActivityTestRule<>(MainActivity.class);
}
這是完整的測試類:
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import com.example.R;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
@RunWith(AndroidJUnit4.class)
public class MainFragmentTest {
@Rule
public ActivityTestRule<MainActivity> mActivityRule =
new ActivityTestRule<>(MainActivity.class);
MainActivity mMainActivity;
MainFragment mMainFragment;
@Before
public void setUp() {
mMainActivity = mActivityRule.getActivity();
mMainFragment = (MainFragment) mMainActivity
.getSupportFragmentManager()
.findFragmentByTag(MainFragment.FRAGMENT_TAG);
}
@Test
public void testHeadline() {
onView(withId(R.id.headline)).check(matches(withText(R.string.headline)));
}
}
我目前正在使用以下工具鏈:
經過一些試驗和錯誤后,我通過這個調整得到了我的運行:
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.1'
改成
androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.2') {
exclude group: 'com.android.support', module: 'support-v4'
}
不知何故,espresso-contrib中包含的東西阻止了正確版本的support-v4
被包含在測試包中,並導致類加載器失敗。
經過一些試驗和錯誤后,我意識到特定AVD仿真器發生錯誤,而其他測試執行成功。 我在問題中沒有提到的一個重要的附注是我使用Google Play服務運行測試的應用程序。 因此,我需要選擇提供框架的模擬器。
作為安裝問題的解決方法,您還可以手動運行檢測:
1.生成目標和測試apk
gradle connectedAndroidTest
它將無法安裝apk,但仍然會將它們生成為輸出。
2.手動安裝test&target apk
adb install XXX-debug-androidTest-unaligned.apk
adb install XXX-debug.apk
3.手動觸發入侵
adb shell am instrument -w -e your.package.test/.common.Instrumentation
這將顯示所有已安裝的儀器:
adb shell pm list instrumentation
有關更多信息,請查看官方儀器文檔 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.