Android问题:Test run failed: Instrumentation run failed due to 'java.lang.RuntimeException'

在初学Android单元测试时遇到'Instrumentation run failed due to 'java.lang.RuntimeException''的问题。通过检查源码发现,问题出在测试类的构造函数上。修复方法是移除泛型并使用无参数构造函数,然后在构造函数内部调用super(),传入应用包名和Activity类。调整后的构造函数为:super(""hkrt.quickpass.MainActivity"

初学Android手机单元测试,遇到了很多问题,其中好多问题都在网上搜索解决了,,但这个问题Test run failed: Instrumentation run failed due to 'java.lang.RuntimeException'  没有解决

 

源码如下:

package hkrt.quickpass.test;


import static org.junit.Assert.*;
import hkrt.quickpass.MainActivity;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import android.test.ActivityInstrumentationTestCase2;

public class MainAcvitityTest extends ActivityInstrumentationTestCase2<MainActivity> {

 public MainAcvitityTest(Class<MainActivity> activityClass) {
  super(activityClass);
  // TODO Auto-generated constructor stub
 }

 @BeforeClass
 public static void setUpBeforeClass() throws Exception {
 }

 @AfterClass
 public static void tearDownAfterClass() throws Exception {
 }

 @Before
 public void setUp() throws Exception {
 }

 @After
 public void tearDown() throws Exception {
 }
 
 @Test
 public void testSum(){
  
  MainActivity mainactivity = new MainActivity();
  
  int result = mainactivity.sum(3, 4);
  assertEquals(5,result);
 }

}

 

 

配置文件AndroidManifest.xml源码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="hkrt.quickpass.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />
 <!-- **** JUnit测试专用,正式发布需要移除 *** -->
    <uses-permission android:name="android.permission.RUN_INSTRUMENTATION" />
    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="hkrt.quickpass" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner" />
    </application>

</manifest>

 

后来找到是构造函数的事,于是把泛型去掉, 然后用不带参数的构造函数,在构造函数里调用super(“com.xxx.xxx”, Activity.class); 就Ok了。

只要把测试类中构造函数修改成

 public MainActivityTest() {
  super("hkrt.quickpass.MainActivity", MainActivity.class);
 }

问题得以解决

### 原因分析 在 Android 测试中出现 `java.lang.RuntimeException: Failed loading specified test class 'android.app.appops.cts.AppOpsLoggingTest'` 错误,通常表明测试运行器无法加载指定的测试类。此类问题的根本原因可能包括以下几点: 1. **测试类未正确打包进 APK** 如果目标测试类 `AppOpsLoggingTest` 没有被正确编译并包含在测试 APK 中,则会导致运行时找不到该类。这可能是由于构建配置错误或源码路径未正确指定所致 [^1]。 2. **类名或包名不匹配** 若测试命令中指定的类名与实际 APK 中定义的类名(包括包名)不一致,也会导致类加载失败。例如,若类实际位于 `com.example.test` 包下,而命令中使用的是 `android.app.appops.cts.AppOpsLoggingTest`,则会抛出 `ClassNotFoundException` [^1]。 3. **依赖缺失或运行时环境不完整** 一些测试类可能依赖特定的系统 API 或库文件。如果这些依赖未正确打包进测试 APK 或设备上缺少相关组件,也可能导致类加载失败 [^1]。 4. **Instrumentation 配置错误** 在 `AndroidManifest.xml` 文件中,若 `<instrumentation>` 标签的 `targetPackage` 属性未正确指向被测应用的包名,也可能导致测试类无法加载 [^1]。 --- ### 解决方案 #### 1. 验证测试 APK 是否包含目标类 使用 `dexdump` 工具检查 APK 中是否包含 `AppOpsLoggingTest` 类: ```bash adb pull /data/app/android.camera.cts-xxx.apk unzip android.camera.cts-xxx.apk -d camera_cts dexdump camera_cts/classes.dex | grep AppOpsLoggingTest ``` 如果输出中没有找到该类,则说明构建流程存在问题,应检查 `Android.mk` 或 `BUILD_NATIVE_TEST` 配置是否包含正确的源码路径和依赖关系 [^1]。 #### 2. 确保类名和包名一致 确认测试类的完整类名与执行命令中的类名完全一致。例如,若类定义如下: ```java package android.app.appops.cts; public class AppOpsLoggingTest { // test methods } ``` 则执行命令应为: ```bash adb shell am instrument -w -e class android.app.appops.cts.AppOpsLoggingTest android.camera.cts/androidx.test.runner.AndroidJUnitRunner ``` 同时,确保 `AndroidManifest.xml` 中的 `<instrumentation>` 配置正确: ```xml <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" android:targetPackage="android.camera.cts" /> ``` #### 3. 检查依赖和运行时环境 若 `AppOpsLoggingTest` 使用了非标准的系统 API 或第三方库,需确保这些依赖已打包进测试 APK,或设备上已安装对应组件。可通过反编译 APK 并检查其依赖项来进一步验证 [^1]。 #### 4. 查看日志以定位具体错误 通过 `adb logcat` 捕获完整的测试启动日志,查找与类加载相关的异常堆栈信息: ```bash adb logcat -s AndroidRuntime ``` 观察是否出现类似以下错误: ``` E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NoClassDefFoundError: Failed resolution of: Landroid/app/appops/cts/AppOpsLoggingTest; at java.lang.Class.classForName(Native Method) ... Caused by: java.lang.ClassNotFoundException: Didn't find class "android.app.appops.cts.AppOpsLoggingTest" on path: DexPathList[... ``` 上述日志可帮助判断是构建问题还是运行时配置不当 [^1]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值