Использовать код из тестового пакета в тестах разных модулей - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть базовый проект в kotlin, настроенный с помощью gradle dsl. Внутри базы у меня есть модуль «приложение» и модуль «библиотека». Модуль приложение использует библиотеку модулей. Я хочу получить доступ к тестам библиотеки модулей из тестов приложения модуля (точнее, пакета testUtils библиотеки).

Файл app.build gradle имеет строку implementation(project(":library")), и поэтому я не могу получить доступ к тестам библиотеки в своем основном коде, что хорошо, но я также не могу получить к нему доступ из тестов приложения.

Я прочитал этот вопрос (возможный дубликат этот вопрос ), где соответствующий код groovy:

task testJar(type: Jar, dependsOn: testClasses) {
    baseName = "test-${project.archivesBaseName}"
    from sourceSets.test.output
}

configurations {
    tests
}

artifacts {
    tests testJar
}

но я не смог реализовать его в Gradle DSL.

Также я проверил этот вопрос где код:

tasks {
    val sourcesJar by creating(Jar::class) {
        dependsOn(JavaPlugin.CLASSES_TASK_NAME)
        classifier = "sources"
        from(sourceSets["main"].allSource)
    }

    val javadocJar by creating(Jar::class) {
        dependsOn(JavaPlugin.JAVADOC_TASK_NAME)
        classifier = "javadoc"
        from(tasks["javadoc"])
    }

    artifacts {
        add("archives", sourcesJar)
        add("archives", javadocJar)
    }
}

Мне нужно как-то добавить testImplementation не только с исходным кодом библиотеки, но и с тестами библиотеки, чтобы в тестах приложения я мог использовать тестовые пакеты библиотеки, а в исходном коде приложения я не мог использовать тесты библиотеки .

Спасибо.

Обновление:

base.build:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.time.Duration

plugins {
    kotlin("jvm") version "1.3.21"
}

allprojects {
    repositories {
        jcenter()
    }
}

subprojects {
    apply(plugin = "kotlin")
    dependencies {
        implementation(kotlin("stdlib-jdk8"))
    }
    tasks.withType<KotlinCompile> {
        kotlinOptions.jvmTarget = "1.8"
    }
    tasks.withType<Test> {
        useJUnitPlatform()

        // Make sure tests don't take over 10 minutes
        timeout.set(Duration.ofMinutes(10))
    }
}

base.settings:

import java.net.URI

rootProject.name = "base"

sourceControl {
    gitRepository(URI("https://github.com/path-to-github.git")) {
        producesModule("path.to.package:primitive-storage-layer")
    }
}

include("library")
include("app")

app.build:

plugins {
    application
}

application {
    mainClassName = "path.to.package.MainKt"
}

val junitVersion = "5.5.0-M1"
val hamkrestVersion = "1.7.0.0"
val mockkVersion = "1.9.3"

dependencies {
    implementation(project(":library"))

    testImplementation("org.junit.jupiter:junit-jupiter-api:$junitVersion")
    testImplementation("org.junit.jupiter:junit-jupiter-params:$junitVersion")
    testImplementation("com.natpryce:hamkrest:$hamkrestVersion")
    testImplementation("io.mockk:mockk:$mockkVersion")

    runtime("org.junit.jupiter:junit-jupiter-engine:$junitVersion")
}

library.build:

val primitiveLibraryVersion = "1.0"
val gsonVersion = "2.8.5"
val junitVersion = "5.5.0-M1"
val mockkVersion = "1.9.3"

dependencies {
    implementation("path.to.package:primitive-storage-layer:$primitiveLibraryVersion")
    implementation("com.google.code.gson:gson:$gsonVersion")

    testImplementation("org.junit.jupiter:junit-jupiter-api:$junitVersion")
    testImplementation("io.mockk:mockk:$mockkVersion")
}

1 Ответ

0 голосов
/ 12 мая 2019

Хотя было бы возможно создать артефакт, содержащий тесты, а затем использовать его из другого проекта, я бы избегал этого и вместо этого реорганизовывал бы утилиты тестирования в отдельный подпроект (что-то вроде ${app}-test-kit), помещая код в main sourceset, а затем зависит от этого подпроекта как от конфигурации приложения, так и от библиотеки testImplementation.

Это дает вам более четкое разделение, и становится более очевидным в отношении того, что передается и почему.

...