Как протестировать пользовательскую задачу 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, позволяют настроить рабочий каталог.