无法找到AndroidJUnit4的委托运行程序androidjunit4classrunner &



我已经编写了测试SQL命令的代码。但是,当我右键单击我的类(如testInsert())时,"运行"报错:

, . lang。RuntimeException:委托运行器androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner为AndroidJUnit4无法找到。"。

AS的版本是4.2.2.

抛出错误后,我立即问我的老师。他建议在依赖项下输入这些代码。
代码如下:

testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

同时,我把test类放在"test"文件夹。

但这两种方法都不是有效的。

然后我查找开发人员手册,但我没有找到解决方案。有什么是我错过或误解的吗?

我参考了谷歌或必应,尽我所能导入各种软件包,但是什么也没有。

之后我添加新的配置。但是没有返回结果。同时Test framework意外退出。

所以你能帮我一个解决方案,一个方向或任何可以指导我克服这个。我真的很感激!

例如,我想测试Dao中的insert()。以下是道类(部分)(这里有一些注释是我为了记住要点而做的标记,请忽略它):

package com.example.databasedemo;
// 该类用于操作数据库的增删改查
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
public class Dao {
private static final String TAG = "Dao";
private final DatabaseHelper mHelper;
public Dao(Context context){
// 创建数据库
// 步骤:
// 1. 写一个类去继承SqliteOpenHelper
// 2. 实现里面的方法
// 实现的参数介绍
/**
*
* @ context   上下文
* @ name      数据库名称
* @ factory   游标工厂
* @ version   版本号
*/
// 3. 创建子类对象,再调用getReadableDatabase()/getWriteableDatabase()方法,即可创建数据库
mHelper = new DatabaseHelper(context);
mHelper.getWritableDatabase();
}
public void insert(){
// 获取到数据库连接(打开数据库
SQLiteDatabase db = mHelper.getWritableDatabase();
// ? 用来防止sql注入
String sql_insert = "insert into " + Constants.TABLE_NAME + " (id, name, age, salary, phone_number, address) values(?, ?, ?, ?, ?, ?)";
db.execSQL(sql_insert, new Object[]{1, "Tom", 25, 5000, 110110110, "USA"});
db.close();
}
}

下面是测试类(我之前创建了数据库和列,这里我只想插入数据):

package com.example.databasedemo;
import android.content.Context;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4.class)
public class TestDatabase extends TestCase {
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
@Test
public void testInsert(){
// 测试插入数据
Dao dao = new Dao(appContext);
dao.insert();
}
}

有依赖关系:

android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.example.databasedemo"
minSdkVersion 22
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
implementation 'androidx.test.ext:junit:1.1.2'
testImplementation 'junit:junit:4.13.1'
// Optional -- Robolectric environment
testImplementation 'androidx.test:core:1.3.0'
// Optional -- Mockito framework
testImplementation 'org.mockito:mockito-core:2.18.0'
testImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'com.android.support:support-annotations:26.1.0'
androidTestImplementation 'com.android.support.test:rules:1.0.2'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation "androidx.test.espresso:espresso-core:3.3.0"
debugImplementation ("androidx.fragment:fragment-testing:1.2.5", {
exclude group: 'androidx.test', module: 'core'
})
}
}
}

最后,我找到了解决办法。
在这里:

首先,我犯了依赖性的错误。我注意到在build.gradle中有两个依赖项。所以我考虑依赖关系是否有问题。所以我重新创建了一个新项目并粘贴了代码。我把包放在不包含"android"的依赖项中。但编译器仍然报告错误是"无法解析符号'AndroidJUnit4'"。我在谷歌上搜索了这个错误。得到了解决方案[在这里输入链接描述][1],这是把类在androidTest文件夹。

所以我可以直接得出结论。
1。把包放在不包含"android"的依赖包中。
2。将类从Test移到AndroidTest下面是我的build.gradle:

android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.example.databasedemo"
minSdkVersion 18
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

Out Solution正如我所发现的,我仍然不知道这两个依赖关系之间的区别。还有test文件夹和androidtest文件夹之间的区别。我将查阅这些文章。无论如何,我欠你一个很大的感激,无论是谁看到,想到,或任何帮助我编辑或传播这个问题。谢谢你!

我也面临着同样的问题,尝试了很多方法。然后我注意到AndroidStudio在一些测试中给我一个警告:

JUnit测试应该返回Unit

刚添加: Unit作为这些测试的返回类型,一切正常

最新更新