Делегировать бегуна androidx.тест.внутренний.бегун.junit4.Не удалось найти AndroidJUnit4ClassRunner для AndroidJUnit4

#android #android-studio #android-testing

Вопрос:

Я написал код для тестирования команд SQL. Но когда я щелкнул правой кнопкой мыши свой класс(например testInsert() ), «Выполнить» сообщил об ошибке:

«исключение java.lang.RuntimeException: Делегировать запуск androidx.тест.внутренний.запуск.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'
 

Тем временем я поместил тестовый класс в папку «тест».

Но оба эти средства не эффективны.

Затем я поискал руководство для разработчиков, но не нашел решения. Есть ли что-нибудь, что я пропустил или неправильно понял?

Я ссылался на Google или Bing, импортировал различные пакеты, как мог, однако ничего не вышло.

При этом я добавляю новую конфигурацию. Но никаких результатов получено не было. Тем временем тестовая платформа неожиданно завершила работу.

Так что не могли бы вы помочь мне с решением, направлением или чем-то еще, что может помочь мне победить это. Я действительно ценю это!

Например, я хочу протестировать функцию insert() в Dao. Вот класс Dao(частичный)(есть несколько заметок, которые я отмечаю, чтобы запомнить пункты, просто игнорируйте их):

 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();
    }
}
 

Here is the test-class(I created the database and columns previously, here I just wanna insert the data):

 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'
            })
            }
        }
    }
 

Комментарии:

1. Вы нашли решение? У меня похожая проблема.

Ответ №1:

Наконец-то я нашел свое решение.
Вот он:

Во-первых, я допустил ошибку зависимостей. Я заметил, что в моем build.gradle было две зависимости. поэтому я рассматриваю, есть ли что-то не так с зависимостями. Поэтому я воссоздал новый проект и вставил код. Я помещаю пакеты в зависимости, в которые не входит «android». Но компилятор все равно сообщил об ошибке «Не удается разрешить символ ‘AndroidJUnit4′». Я погуглил эту ошибку. Получил решение в [введите описание ссылки здесь][1], которое помещает класс в папку androidTest.

Так что я могу сделать поспешный вывод.
1. Поместите пакеты в зависимости, в которые не входит «android».
2. Удалите класс из теста в androidTest

Вот моя сборка.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'
}
 

Как я нашел решение, я все еще не знаю разницы между этими двумя зависимостями. Также различие между тестовой папкой и папкой androidTest. Я ознакомлюсь со статьями.

В любом случае, я в большом долгу перед вами за то, что вы видели, подумали или помогли мне отредактировать или распространить этот вопрос. Спасибо!