Android单元测试 - 未找到InstrumentationTestRunner子类

时间:2011-05-03 02:27:22

标签: android unit-testing

我在使用InstrumentationTestRunner的子类时遇到了另一个问题。

这是子类的代码:

package com.jlptquiz.app.tests;
/**
 * 
 */


import junit.framework.TestSuite;


import android.test.InstrumentationTestRunner;
import android.test.InstrumentationTestSuite;

public class MyInstrumentationTestRunner extends InstrumentationTestRunner {

    public TestSuite getAllTests(){
        InstrumentationTestSuite suite = new InstrumentationTestSuite(this);

        suite.addTestSuite(UtilsTestCase.class);
        return suite;
    }


    public ClassLoader getLoader() {
        return MyInstrumentationTestRunner.class.getClassLoader();
    }


}

这是单元测试:

package com.jlptquiz.app.tests;

import com.jlptquiz.app.Utils;

import junit.framework.Assert;

import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.test.ActivityInstrumentationTestCase2;
import android.util.Log;

public class UtilsTestCase extends ActivityInstrumentationTestCase2 {

    private Context mContext;
    private Utils utils;
    public static String TAG = "GetResourceStringTestCase";

    public UtilsTestCase() {
        super("com.jlptquiz.app", Utils.class);
    }

    public void setup() {
        try {
            super.setUp();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mContext = this.getInstrumentation().getContext();

    }

    public void testRandomNumberEqaulsOne() {

        utils = (Utils) this.getActivity();

        int randNum = Utils.genRandomNumber(1, 1);

        Integer actual = Integer.valueOf(randNum);
        Integer expected = Integer.valueOf(1);
        Assert.assertSame(expected, actual);
    }

}

这是清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jlptquiz.app" android:versionCode="1" android:versionName="1.0">
    <application android:name="AppState" android:debuggable="true"
        android:clearTaskOnLaunch="true"
        android:icon="@drawable/ic_icon" android:label="@string/app_name">
        <activity android:name="JlptQuizStartActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="QuestionActivity"></activity>
        <activity android:name="AnswerActivity"></activity>
        <activity android:name="SettingsActivity"></activity>
        <uses-library android:name="android.test.runner" />
    </application>
    <instrumentation android:label="AllTests" 
    android:name="com.jlpt.quiz.app.tests.MyInstrumentationTestRunner"
    android:targetPackage="com.jlptquiz.app"/>

    <uses-sdk android:minSdkVersion="5" />

</manifest>

运行配置是一个android junit测试配置,它将MyInstrumentationTestRunner指定为ImplementationTestRunner。

但是,根据logcat,我在MyInstrumentationTestRunner上找到了一个未找到类的异常:

/AndroidRuntime(  835): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
D/AndroidRuntime(  835): CheckJNI is ON
D/AndroidRuntime(  835): Calling main entry com.android.commands.am.Am
I/ActivityManager(   61): Force stopping package com.jlptquiz.app uid=10034
I/ActivityManager(   61): Start proc com.jlptquiz.app for added application com.jlptquiz.app: pid=843 uid=10034 gids={}
D/AndroidRuntime(  843): Shutting down VM
W/dalvikvm(  843): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime(  843): FATAL EXCEPTION: main
E/AndroidRuntime(  843): java.lang.RuntimeException: Unable to instantiate instrumentation ComponentInfo{com.jlptquiz.app/com.jlpt.quiz.app.tests.MyInstrumentationTestRunner}: java.lang.ClassNotFoundException: com.jlpt.quiz.app.tests.MyInstrumentationTestRunner in loader dalvik.system.PathClassLoader[/system/framework/android.test.runner.jar:/data/app/com.jlptquiz.app-1.apk:/data/app/com.jlptquiz.app-1.apk]
E/AndroidRuntime(  843):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3194)
E/AndroidRuntime(  843):    at android.app.ActivityThread.access$2200(ActivityThread.java:117)
E/AndroidRuntime(  843):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:966)
E/AndroidRuntime(  843):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  843):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  843):    at android.app.ActivityThread.main(ActivityThread.java:3647)
E/AndroidRuntime(  843):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  843):    at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(  843):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/AndroidRuntime(  843):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime(  843):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(  843): Caused by: java.lang.ClassNotFoundException: com.jlpt.quiz.app.tests.MyInstrumentationTestRunner in loader dalvik.system.PathClassLoader[/system/framework/android.test.runner.jar:/data/app/com.jlptquiz.app-1.apk:/data/app/com.jlptquiz.app-1.apk]
E/AndroidRuntime(  843):    at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
E/AndroidRuntime(  843):    at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
E/AndroidRuntime(  843):    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/AndroidRuntime(  843):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3191)
E/AndroidRuntime(  843):    ... 10 more
W/ActivityManager(   61): Error in app com.jlptquiz.app running instrumentation ComponentInfo{com.jlptquiz.app/com.jlpt.quiz.app.tests.MyInstrumentationTestRunner}:
W/ActivityManager(   61):   java.lang.ClassNotFoundException
W/ActivityManager(   61):   java.lang.ClassNotFoundException: com.jlpt.quiz.app.tests.MyInstrumentationTestRunner in loader dalvik.system.PathClassLoader[/system/framework/android.test.runner.jar:/data/app/com.jlptquiz.app-1.apk:/data/app/com.jlptquiz.app-1.apk]
I/ActivityManager(   61): Force stopping package com.jlptquiz.app uid=10034
I/Pro

我知道我要离开这里的轨道吗?

3 个答案:

答案 0 :(得分:3)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    **package="com.jlptquiz.app.tests"** android:versionCode="1" android:versionName="1.0">
    <application android:name="AppState" android:debuggable="true"
        android:clearTaskOnLaunch="true"
        android:icon="@drawable/ic_icon" android:label="@string/app_name">
        <activity android:name="JlptQuizStartActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="QuestionActivity"></activity>
        <activity android:name="AnswerActivity"></activity>
        <activity android:name="SettingsActivity"></activity>
        <uses-library android:name="android.test.runner" />
    </application>
    <instrumentation android:label="AllTests" 
    android:name="com.jlpt.quiz.app.tests.MyInstrumentationTestRunner"
    **android:targetPackage="com.jlptquiz.app.tests"/>**

    <uses-sdk android:minSdkVersion="5" />

</manifest>

变化

**package="com.jlptquiz.app.tests"**
 **android:targetPackage="com.jlptquiz.app.tests"/>**

答案 1 :(得分:1)

运行

$ adb -s <serialno> shell pm list instrumentation

验证您的工具是否完全按照您的预期定义。

然后验证您的测试项目清单是否包含

  <uses-library android:name="android.test.runner" />

最后,运行测试。

答案 2 :(得分:0)

我最终回到Google文档并做了他们推荐的事情,这是为测试设置一个单独的项目。这会为您处理所有manifest.xml内容。

相关问题