Как протестировать пользовательскую задачу Gradle в директории тестового проекта

У меня есть пользовательский плагин Gradle с такой задачей:

@TaskAction
def buildSemanticVersion() {
    int major = project.semanticVersion.major
    int minor = project.semanticVersion.minor
    int patch = "git rev-list HEAD --count".execute().text.toInteger()

    project.setVersion("${major}.${minor}.${patch}")
}

У меня есть интеграционный тест для этого:

@Test
public void testBuildSemanticVersion() throws Exception {
    // GIVEN
    Project project = ProjectBuilder.builder().withProjectDir(new File("build/tmp/git-repository")).build()
    project.apply plugin: 'com.github.moleksyuk.vcs-semantic-version'
    project.semanticVersion.with { major = 1; minor = 2 }

    // WHEN
    project.tasks.buildSemanticVersion.execute()

    // THEN
    assertThat(project.version, Matchers.equalTo('1.2.3'))
}

Но это не удается, потому что моя команда "git rev-list HEAD --count".execute(). Text.toInteger() в задаче выполняется снова в моем каталоге проекта, но не в моем тестовом каталоге "build / tmp / git-repository".

Возможно ли выполнить эту задачу снова в тестовом каталоге проекта?

Обновить:

Спасибо @Mark Vieira и @Rene Groeschke. По их предложению я исправил это так:

@TaskAction
def buildSemanticVersion() {
    int major = project.semanticVersion.major
    int minor = project.semanticVersion.minor

    def stdout = new ByteArrayOutputStream()
    def execResult = project.exec({
        commandLine 'git'
        args 'rev-list', 'HEAD', '--count'
        standardOutput = stdout;
    })

    int patch = stdout.toString().toInteger()

    project.setVersion("${major}.${minor}.${patch}")
}

1 ответ

Решение

groovys "...".execute() всегда использует текущий рабочий каталог процесса Java и, насколько я знаю, это не настраивается.

Этот провальный тест уже показывает проблему с вашей реализацией задачи, так как рабочий каталог не обязательно является каталогом проекта. Вы могли бы использовать Exec задание или обернуть project.exec метод в вашей собственной задаче. Оба проекта, Project.exe и Exec, позволяют настроить рабочий каталог.

Другие вопросы по тегам