Обновление с Java 8 до 11, почему весенние тесты не проверяют компоненты должным образом? - PullRequest
0 голосов
/ 24 января 2019

Я начинаю некоторые обновления нашей инфраструктуры, обновляя некоторые библиотеки для использования Gradle 5.1 (с 4.2), Spring Boot 2 (с 1.5), Java 11 (с 8), а затем с целью использования Java 11модульная система.

Я сделал все обновления, а затем мои тесты не пройдены на последнем этапе.Похоже, что когда я инструктирую Gradle запускать тесты, используя путь к модулю, Spring не забирает мои объекты @Component, и моя автопроводка завершается неудачей.

Чтобы было ясно, тесты проходят при использовании Java 11 ипуть к классу по умолчанию, но не удается, когда я добавляю задачи compileTestJava и test, показанные ниже.(Эти задачи были основаны на примере из gradle.org java 9 guide ). Код все еще компилируется (я преодолел все ошибки сборки, связанные с модулем), и контекст Spring пытается встать, когдаЯ получаю сообщение об ошибке ниже.

Когда я использую Spring для включения репозиториев JPA, он находит эти классы (в разных пакетах одного и того же проекта) и создает из них одноэлементные компоненты, как и ожидалось.Но когда я запускаю тест для сервиса, которому нужен экземпляр сервиса, который он тестирует, он не создает этот компонент.

Поэтому очевидный вопрос заключается в том, почему мой тест больше не может найти эти классы для создания.?

build.gradle (обрезано)

plugins {
    id 'java'
    id 'com.gradle.build-scan' version "2.1"
    id 'org.springframework.boot' version "2.1.2.RELEASE"
    id 'maven-publish'
}

//sourceCompatibility = '1.8'
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

if (!hasProperty('mainClass')) {
    ext.mainClass = ''
}

jar {
    enabled = true
    baseName = "my-jar"

    // For embedded tomcat apps
    manifest.attributes provider: 'gradle'
}

compileJava {
    inputs.property("moduleName", "com.mypackage.academics")

    doFirst {
        options.compilerArgs = [
            '--module-path', classpath.asPath,
        ]
        classpath = files()  
    }
}

compileTestJava {
    inputs.property("moduleName", "com.mypackage.academics")
    doFirst {
        options.compilerArgs = [
            '--module-path', classpath.asPath, 
            '--add-modules', 'junit',  
            '--add-reads', "com.mypackage.academics=junit", 
            '--patch-module', "com.mypackage.academics=" + "src/test/resources:" + files(sourceSets.test.java.srcDirs).asPath, 
        ]
        classpath = files()
    }
}

test {
    inputs.property("moduleName", "com.mypackage.academics")
    doFirst {
        jvmArgs = [
            '--module-path', classpath.asPath, 
            '--add-modules', 'ALL-MODULE-PATH', 
            '--add-reads', "com.mypackage.academics=junit,spring.test,org.hamcrest", 
            '--patch-module', "com.mypackage.academics=" + "src/test/resources:" + files(sourceSets.test.java.outputDir).asPath, 
        ]
        classpath = files()
    }
}

module-info.java (обрезано)

module com.mypackage.academics {
    exports com.mypackage.academics.config;

    opens com.mypackage.academics.config to org.hibernate.orm.core, spring.core;

    requires spring.beans;
    requires spring.data.commons;
    requires spring.context;
    requires spring.core;
    requires spring.data.jpa;
    requires spring.tx;
}

Ошибка:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.mypackage.academics.config.AcademicsConfigService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at spring.beans@5.1.4.RELEASE/org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1651)
    at spring.beans@5.1.4.RELEASE/org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1210)
    at spring.beans@5.1.4.RELEASE/org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1164)
    at spring.beans@5.1.4.RELEASE/org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)
    ... 52 more

1 Ответ

0 голосов
/ 18 февраля 2019

Насколько я понимаю, это ожидаемое поведение в отношении Java 11.

Проблема обсуждается в этой теме. http://mail.openjdk.java.net/pipermail/core-libs-dev/2018-July/054228.html

По сути, способ выполнения тестов устанавливает классы приложений на пути к модулю, в то же время используя путь к классам для тестовых классов.

...