Как читать из файла json в тестовом модуле, совместно используемом с другими модулями? - PullRequest
1 голос
/ 03 августа 2020

Для чтения из файла json в папке resources папки test я использую

sourceSets {

    val sharedTestDir = "src/test-shared/java"

    getByName("test") {
        java.srcDir(sharedTestDir)
    }

    getByName("androidTest") {
        java.srcDir(sharedTestDir)
        resources.srcDir("src/test/resources")
    }
}

, а в тестовой общей папке я использую функции расширения для преобразования файла json в объекты

fun getResourceAsText(path: String): String {
    return object {}.javaClass.classLoader!!.getResource(path)!!.readText()
}

inline fun <reified T> convertToObjectFromString(input: String): T? {
    return Gson().fromJsonWithType<T>(input)
}

inline fun <reified T> Gson.fromJsonWithType(json: String): T? =
    fromJson<T>(json, object : TypeToken<T>() {}.type)

Я создал тестовый модуль test-utils, который будет использоваться в других модулях, чтобы предотвратить тот же шаблонный код.

Проблема, которую я увидел при изучении других проектов, я видел, что вы не используете не добавляйте зависимости к этому модулю, используя testImplementation или androidTestImplementation, вместо этого вы помещаете файлы в папку main вместо test-shared, и используете implementation и добавляете этот модуль в другие модули, используя testImplementation(project("..")), если вы используете testImplementation вместо implementation, вы получаете неразрешенную ссылку ошибку из тестов, например, в модуле data.

Зависимости в test-utils модуле build.gradle.kts

dependencies {

    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))

    implementation(Deps.KOTLIN)
    implementation(Deps.ANDROIDX_CORE_KTX)
    implementation(Deps.RX_JAVA)
    implementation(Deps.RX_ANDRIOD)
    implementation(Deps.COROUTINES_CORE)
    implementation(Deps.COROUTINES_ANDROID)

    implementation(TestDeps.ANDROIDX_CORE_KTX)
    implementation(TestDeps.ANDROIDX_CORE_TESTING)

    implementation(Deps.GSON)
}

Добавить модуль test-utils в качестве проекта в модуль data с помощью

testImplementation(project(Modules.AndroidLibrary.TEST_UTILS))

Однако при таком подходе я не могу читать из файла json, расположенного в папке resources внутри test папки и получить исключение нулевого указателя. Кроме того, нельзя использовать папку assets, так как этот файл требуется в модульных тестах? Есть ли способ добавить файл json, не помещая его в папку ресурсов в каждом модуле?

...