Spring Boot 测试不适用于 Java 11

Posted

技术标签:

【中文标题】Spring Boot 测试不适用于 Java 11【英文标题】:Spring Boot Test not working with Java 11 【发布时间】:2019-11-24 01:41:57 【问题描述】:

我正在尝试将现有的 Java 8 多项目 gradle 应用程序升级到 Java 11。在修复了一些编译问题后,我最终在测试用例中遇到了问题。当我在 Intellij 中运行测试时,它会引发以下错误:

错误:java:尝试重新创建类型为 QueryDsl 类的文件

它正在尝试生成 Querydsl 类,但由于这些类已经存在,因此测试会抛出异常。

我正在使用 Java11、IntelliJ 2019、Gradle 5 来运行应用程序。

这些测试在 Java8 中按预期工作。

我不知道是什么导致了这个错误。任何人都可以帮助我理解这一点。

代码sn-ps如下。

根项目 build.gradle:

buildscript 
  repositories 
    maven 
      url "https://plugins.gradle.org/m2/"
    
     mavenCentral()
  
  dependencies 
    classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.4.RELEASE)
    classpath("net.ltgt.gradle:gradle-apt-plugin:0.21")
  

subprojects 

  apply plugin: 'java'

  repositories 
    mavenCentral()
  

  sourceCompatibility = JavaVersion.VERSION_11
  targetCompatibility = JavaVersion.VERSION_11

  task allDependencies(type: DependencyReportTask) 

  jar 
    baseName = "$parent.name-$project.name"
  

  sourceSets 
    main 
      java 
        srcDirs 'src/main/java', 'build/generated/sources/main/java', 'build/generated/sources/annotationProcessor/java/main'
      
    
  



子项目build.gradle:

apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'net.ltgt.apt'

bootJar 
  baseName = "test"
  version =  "1.0.0"


dependencies 
compile("org.springframework.boot:spring-boot-starter-data-jpa: 2.1.4.RELEASE")
    compile("com.querydsl:querydsl-core:4.1.3")
    compile("com.querydsl:querydsl-jpa:4.1.3")
    annotationProcessor(
          "com.querydsl:querydsl-apt:4.1.3:jpa",
          "javax.annotation:javax.annotation-api:1.3.2"
  )
  annotationProcessor("org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final")

  testCompile("org.springframework.boot:spring-boot-starter-test:2.1.4.RELEASE")
  testCompile("com.h2database:h2:2.1.4.RELEASE")


集成测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainClass.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ServiceImplTest 

  @Autowired
  private Service1Impl service;

  @Test
  public void getData() 
    Data data = service.getData();
    Assert.assertEquals(0, data.size());
  

【问题讨论】:

请出示您的代码。 @Codo 我已经添加了必要的代码 sn-ps。 【参考方案1】:

我遇到了同样的问题,问题在于 gradle 中依赖项的顺序。 intellij中的java编译器不知何故不能正常工作。

确保您对 QueryDSL 有此依赖项

annotationProcessor group: 'com.querydsl', name: 'querydsl-apt', version: querydsl_version, classifier: 'jpa'
    annotationProcessor group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.1-api', version: hibernate_jpa_version
    annotationProcessor group: 'javax.annotation', name: 'javax.annotation-api', version: javax_annotation_version

删除项目中的 out 文件夹以防万一,然后使用 Ctrl+f9 重新构建。

请注意,从 gradle 和 test 命令执行构建工作正常。看看这个https://blog.jdriven.com/2018/10/using-querydsl-annotation-processor-with-gradle-and-intellij-idea/

【讨论】:

我更改了依赖项的顺序并保持与链接中提到的相同。删除文件夹并重建,在 intellij 中运行测试时仍然出现相同的错误

以上是关于Spring Boot 测试不适用于 Java 11的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 单元测试不适用于 application.yml

JSF 注释不适用于 Spring-boot

使用 'mvn spring-boot:run' 时出错;但不适用于 java -jar 或 intelliJ

JAX-RS 不适用于 Spring Boot 1.4.1

定制的 ObjectMapper 不适用于 spring boot hatoas

Spring Boot Autowired 存储库不适用于 SpringRunner 和 JPA 数据