我正在构建一个Android应用程序,我想用JUnit测试进行单元测试,而不是Android JUnit测试(因为使用模拟器运行Android测试需要花费太长时间)。
环境:
只要我测试自己的没有依赖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帖子也没有帮助我:
非常感谢任何帮助!
答案 0 :(得分:1)
要在单元测试中运行依赖于Android框架的任何内容,您必须使用Android测试运行器。没有别的办法。该框架必须存在。
答案 1 :(得分:0)
如果我创建一个测试项目(只是一个简单的Java项目,使用JUnit和Android作为库而不是 Android 测试项目),那么我可以运行单元测试而不会遇到麻烦类路径中的Android库。
如果您有按照我所采用的相同方法的冲动,您可能还会遇到下一个问题,即您的代码中没有Android Log语句,因为Android框架会抛出{{1}当你执行例如RuntimeException
。
由于我仍然喜欢记录,我将Log.i("tag", "msg")
类包装如下:
Log
我在测试类的设置中禁用了Logger。这样我就避开了Android框架中的异常。
如果有人有更好的解决方案,我非常愿意接受建议。
非常感谢。
BAS
答案 2 :(得分:0)
使用Robolectric。它会为你嘲笑所有Android类。