所以在我进入之前,我想描述一下我的设置。这就是我所拥有的:
一个名为MainActivity.java的文件,它是一个简单的Activity类,具有onCreate()方法和执行Toast消息的btnClick()方法。就是这样,没什么复杂的。此MainActivity.java的包名称为com.testapp。
一个名为LoadInst.java的文件,它是一个Instrumentation类,它尝试将MainActivity.java加载到Class对象中。这个包的名称是com.inst。
所以我想要做的是在LoadInst.java类中,我将MainActivity.java类加载到Class对象中,然后创建一个方法对象来表示onCreate()方法以便调用onCreate()方法。问题是我在MainActivity.java onCreate()方法尝试执行行super.onCreate(savedInstanceState)时抛出异常null 我不知道它是否因为它缺少一些正确执行super.onCreate(savedInstanceState)所需的信息。 这是我的LoadInst.java中的代码,它扩展到Instrumentation类。
package com.inst;
import java.lang.reflect.Method;
import android.app.Activity;
import android.app.Instrumentation;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import android.view.View;
public class LoadInst extends Instrumentation {
@Override
public void onCreate(Bundle arguments) {
super.onCreate(arguments);
start();
}
@Override
public void onStart() {
super.onStart();
String mainAct= "com.testapps.MainActivity";
Looper.prepare();
try {
Class<?> clazz = Class.forName(mainAct);
Object obj = clazz.newInstance();
Class onCreateParam[] = new Class[1];
onCreateParam[0] = Bundle.class;
Method onCreateMethod = Class.getDeclaredMethod("onCreate", onCreateParam);
Bundle bundle = new Bundle();
Log.d("TAG", "test: invoking onCreate()");
onCreateMethod.setAccessible(true);
onCreateMethod.invoke(obj, bundle);
}
catch (ClassNotFoundException e) {
Log.d("TAG", "ClassNotFoundException: " + e.getMessage());
}
catch (Exception e) {
Log.d("TAG", "Exception: " + e.getMessage());
}
}
}
基本上,我的目标是创建一个通用的Instrumentation类来对任何目标类执行测试。所以,说我有app1。 App1是一个简单的Android应用程序,有一个按钮,当你点击按钮时,它会执行一个toast消息。我的目标是使用一个检测类,使用Class加载app1的主要活动,然后调用onCreate()方法以确保初始化任何对象/变量,然后调用btnClick()方法来执行该方法中的代码(在这种情况将是祝酒词。)
换句话说,当我启动instrumentation类时,我会使用Bundle提供数据,因此检测类将通过bundle解析并提取目标包,目标类和我想要为其执行的方法。目标类。 现在我可以使用Class加载类,然后我可以执行btnClick()方法,但问题是如果在onCreate()期间有初始化的对象/变量,那么如果调用它将导致检测类失败一种方法,它使用在onCreate()期间初始化的那些对象/变量之一。