Android - 单元测试无法引用Android类

时间:2013-09-16 20:07:32

标签: java android eclipse unit-testing junit

我正在构建一个Android应用程序,我想用JUnit测试进行单元测试,而不是Android JUnit测试(因为使用模拟器运行Android测试需要花费太长时间)。

环境:

  • 的Eclipse
  • Android项目
  • Android测试项目(目标包= android项目包)
  • JUnit4 / Mockito
  • 使用JUnit运行单元测试(故意不 Android JUnit)

只要我测试自己的没有依赖Android类的编写类,一切都顺利。但是,当我想为包含例如Log.i()语句或引用TextView,然后我遇到以下错误:

  

java.lang.NoClassDefFoundError:android / text / TextWatcher at   java.lang.ClassLoader.defineClass1(本机方法)

Android应用程序清单:

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

Android测试项目清单:

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

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

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.cleancode.lifesaver" />

要测试的课程:

import android.widget.TextView;

public class CapCharacterTextValidator extends TextValidator {

    public CapCharacterTextValidator(TextView textView) {
        super(textView);
    }

    @Override
    public void validate(TextView textView, String text) {

    }
}

测试类:

import org.junit.Test;
import com.cleancode.lifesaver.utils.CapCharacterTextValidator;

public class CapCharactersTextValidatorTests {

    @Test
    public void validateCharacters() {
        new CapCharacterTextValidator(null);
    }
}

我试图在Android应用程序和Android测试应用程序中的导出库中添加android库,或者两者中的一个,仍然没有给我一个绿色测试。无论我尝试什么,我都会遇到这个NoClassDefFoundError

我阅读了大部分的Android文档,但他们似乎非常喜欢在模拟器上使用Android JUnit的(对我来说太慢)方法。

以下Q&amp; A帖子也没有帮助我:

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

要在单元测试中运行依赖于Android框架的任何内容,您必须使用Android测试运行器。没有别的办法。该框架必须存在。

答案 1 :(得分:0)

嗯,找到另一种选择,它可能是唯一的方式&#39;因为我正在回到Android JUnit测试。

如果我创建一个测试项目(只是一个简单的Java项目,使用JUnit和Android作为库而不是 Android 测试项目),那么我可以运行单元测试而不会遇到麻烦类路径中的Android库。

如果您有按照我所采用的相同方法的冲动,您可能还会遇到下一个问题,即您的代码中没有Android Log语句,因为Android框架会抛出{{1}当你执行例如RuntimeException

由于我仍然喜欢记录,我将Log.i("tag", "msg")类包装如下:

Log

我在测试类的设置中禁用了Logger。这样我就避开了Android框架中的异常。

如果有人有更好的解决方案,我非常愿意接受建议。

非常感谢。

BAS

答案 2 :(得分:0)

使用Robolectric。它会为你嘲笑所有Android类。