gradle在集成测试中找不到lombok生成的构造函数

lap*_*ots 2 java integration-testing gradle lombok

我有集成测试,带有带有lombok注释的内部类。看起来像这样

@Test(dataProvider = "jsonDiff")
public class JaversDiffIntegrationTest {

    public void shouldCompareEntities(Person input1, Person input2, String expectedJson)
        throws JSONException {
        Person p1 = new Person("p_id", "Jack");
        Person p2 = new Person("p_id", "Michael");
        ....
    }

    @TypeName("TestEntityPerson")
    @Data
    @AllArgsConstructor
    private class Person {
        private String id;
        private String name;
    }
Run Code Online (Sandbox Code Playgroud)

Idea启用注释处理后,至少它可以编译。当我尝试运行clean build通过gradlew我的错误

constructor Person in class JaversDiffIntegrationTest.Person cannot be applied to given types;
    Person p2 = new Person("p_id", "Michael");
                    ^
    required: no arguments
    found: String,String
Run Code Online (Sandbox Code Playgroud)

似乎看不到lombok生成的构造函数。我的build.gradle样子是这样(我使用gradle5

apply plugin: 'idea'

// TODO: move to integration-test.gradle
sourceSets {
    integrationTest {
        java.srcDir 'src/testInteg/java'
        resources.srcDir 'src/testInteg/resources'
    }
}

configurations {
    integrationTestImplementation.extendsFrom implementation
    integrationTestRuntimeOnly.extendsFrom runtimeOnly
}

task integrationTest(type: Test) {
    testClassesDirs = sourceSets.integrationTest.output.classesDirs
    classpath = sourceSets.integrationTest.runtimeClasspath + sourceSets.test.runtimeClasspath
    outputs.upToDateWhen { false }
    mustRunAfter test

    useTestNG() {
        suites 'src/testInteg/resources/testng.xml'
    }

    testLogging {
        showStandardStreams = true
    }
}

check.dependsOn integrationTest

dependencies {
    implementation "javax.validation:validation-api:1.1.0.Final"
    testImplementation "junit:junit:4.11"

    testImplementation "org.spockframework:spock-core:1.3-groovy-2.5"
    testImplementation "org.codehaus.groovy:groovy-all:2.5.6"

    implementation "org.javers:javers-core:5.3.2"
    annotationProcessor "org.projectlombok:lombok:1.18.6"
    implementation "org.projectlombok:lombok:1.18.6"

    integrationTestImplementation "org.testng:testng:6.14.3"
    integrationTestImplementation "org.skyscreamer:jsonassert:1.5.0"
    integrationTestImplementation "com.google.code.gson:gson:2.8.5"
    integrationTestImplementation "commons-io:commons-io:2.6"
}
Run Code Online (Sandbox Code Playgroud)

问题是什么?也许我的integrationTest配置有问题?

小智 10

我也发现了同样的问题,并通过在 annotationProcessor 旁边添加 testAnnotationProcessor 到 build.gradle 来修复:

annotationProcessor "org.projectlombok:lombok:${lombok_version}"
testAnnotationProcessor "org.projectlombok:lombok:${lombok_version}"
Run Code Online (Sandbox Code Playgroud)


小智 9

根据 lombok ( lombok gradle )

repositories {
    mavenCentral()
}

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.24'
    annotationProcessor 'org.projectlombok:lombok:1.18.24'
    
    testCompileOnly 'org.projectlombok:lombok:1.18.24'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.24'
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*iki 5

I believe the crucial bit that you are missing is an annotation processor configuration for your integrationTest source set:

    integrationTestAnnotationProcessor "org.projectlombok:lombok:1.18.6"
Run Code Online (Sandbox Code Playgroud)

In the following, you can find a self-contained, working example (tested with Gradle 5.3.1). It’s not exactly your project but should be close enough to get you on track:

build.gradle

apply plugin: 'java'

sourceSets {
    integrationTest {
        java.srcDir 'src/testInteg/java'
        resources.srcDir 'src/testInteg/resources'
    }
}

configurations {
    integrationTestImplementation.extendsFrom testImplementation
    integrationTestRuntimeOnly.extendsFrom testRuntimeOnly
}

task integrationTest(type: Test) {
    testClassesDirs = sourceSets.integrationTest.output.classesDirs
    classpath = sourceSets.integrationTest.runtimeClasspath + sourceSets.test.runtimeClasspath
}

repositories {
    jcenter();
}

dependencies {
    implementation "org.projectlombok:lombok:1.18.6"

    testImplementation "junit:junit:4.11"

    integrationTestAnnotationProcessor "org.projectlombok:lombok:1.18.6"
}
Run Code Online (Sandbox Code Playgroud)

src/testInteg/java/MyTest.java

public class MyTest {

  @org.junit.Test
  public void test() {
    new Person("foo", "bar");
    assert true;
  }

  @lombok.AllArgsConstructor
  private class Person {
    private String id;
    private String name;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 现在是 testAnnotationProcessor。 (4认同)