google / compile-testing

Testing tools for javac and annotation processors
Apache License 2.0
696 stars 119 forks source link

test annotation processors generate source code is correct ,but report error: cannot find symbol #378

Closed MABIY closed 11 months ago

MABIY commented 11 months ago

l use separate integration test projects generate source code is ok ,but use compile-testing get error: cannot find symbo.

test unit:

import com.google.testing.compile.Compilation;
import com.google.testing.compile.JavaFileObjects;
import com.lh.annotationprocessor.AutoValueProcessor;
import org.junit.jupiter.api.Test;

import javax.tools.JavaFileObject;

import static com.google.testing.compile.CompilationSubject.assertThat;
import static com.google.testing.compile.Compiler.javac;

/**
 * @author lh
 */
public class ProcessorTest {
    @Test
    public void test() {
        JavaFileObject helloWorld = JavaFileObjects.forResource("Person.java");
        Compilation compilation =
                javac()
                        .withProcessors(new AutoValueProcessor())
                        .compile(helloWorld);
        assertThat(compilation).succeeded();

    }
}

error message:

Compilation produced the following diagnostics:
/SOURCE_OUTPUT/com/lh/test/annotationprocessor/value/PersonNEW.java:13: error: cannot find symbol
    entity.setAge(age);
          ^
  symbol:   method setAge(int)
  location: variable entity of type com.lh.test.annotationprocessor.value.PersonNEW
/SOURCE_OUTPUT/com/lh/test/annotationprocessor/value/PersonNEW.java:18: error: cannot find symbol
    entity.setAge(age);
          ^
  symbol:   method setAge(int)
  location: variable entity of type com.lh.test.annotationprocessor.value.PersonNEW
/SOURCE_OUTPUT/com/lh/test/annotationprocessor/value/PersonNEW.java:23: error: cannot find symbol
    entity.setAge(age);
          ^
  symbol:   method setAge(int)
  location: variable entity of type com.lh.test.annotationprocessor.value.PersonNEW
Generated Source Files
======================

/SOURCE_OUTPUT/com/lh/test/annotationprocessor/value/PersonNEW.java:
package com.lh.test.annotationprocessor.value;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

@Data
public class PersonNEW {
  @JsonIgnore
  private int age;

  public PersonNEW create() {
    PersonNEW entity = new PersonNEW();
    entity.setAge(age);
    return entity;
  }

  public PersonNEW assign(PersonNEW entity) {
    entity.setAge(age);
    return entity;
  }

  public PersonNEW patch(PersonNEW entity) {
    entity.setAge(age);
    return entity;
  }
}

    at app//ProcessorTest.test(ProcessorTest.java:22)
    at [[Reflective call: 4 frames collapsed (https://goo.gl/aH3UyP)]].(:0)
    at [[Testing framework: 27 frames collapsed (https://goo.gl/aH3UyP)]].(:0)
    at java.base@17.0.8/java.util.ArrayList.forEach(ArrayList.java:1511)
    at [[Testing framework: 9 frames collapsed (https://goo.gl/aH3UyP)]].(:0)
    at java.base@17.0.8/java.util.ArrayList.forEach(ArrayList.java:1511)
    at [[Testing framework: 21 frames collapsed (https://goo.gl/aH3UyP)]].(:0)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:110)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:90)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:85)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:62)
    at [[Reflective call: 4 frames collapsed (https://goo.gl/aH3UyP)]].(:0)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
    at jdk.proxy1/jdk.proxy1.$Proxy2.stop(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60)
    at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
    at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:113)
    at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65)
    at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
    at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)

recurrent: repority: https://github.com/MABIY/java-practices gralde command: gradle :java-base:annotation-processing:annotation-processor:test

tbroyer commented 11 months ago

If you don't also use the Lombok "annotation processor", then indeed setAge doesn't exist so this is expected.

MABIY commented 11 months ago

If you don't also use the Lombok "annotation processor", then indeed setAge doesn't exist so this is expected.

thank you, l'm not find relize this.

change later test is success.

import com.google.testing.compile.Compilation;
import com.google.testing.compile.Compiler;
import com.google.testing.compile.JavaFileObjects;
import com.lh.annotationprocessor.AutoValueProcessor;
import org.hamcrest.MatcherAssert;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import javax.annotation.processing.Processor;
import javax.tools.JavaFileObject;

import java.io.IOException;

import static com.google.testing.compile.CompilationSubject.assertThat;
import static org.hamcrest.CoreMatchers.is;

/**
 * @author lh
 */
public class ProcessorTest {
    Compiler compiler;

    @BeforeEach
    public void setupCompiler() throws Exception {
        Class<?> lombokAnnotationProcessor =
                getClass().getClassLoader().loadClass("lombok.launch.AnnotationProcessorHider$AnnotationProcessor");
        Class<?> lombokClaimingProcessor =
                getClass().getClassLoader().loadClass("lombok.launch.AnnotationProcessorHider$ClaimingProcessor");
        compiler = Compiler.javac()
                .withProcessors(
                        (Processor) lombokAnnotationProcessor
                                .getDeclaredConstructor()
                                .newInstance(),
                        (Processor)
                                lombokClaimingProcessor.getDeclaredConstructor().newInstance(),
                        new AutoValueProcessor());
    }

    @Test
    public void test() throws IOException {
        JavaFileObject helloWorld = JavaFileObjects.forResource("Person.java");
        Compilation compilation = compiler.compile(helloWorld);
        assertThat(compilation).succeeded();
        String actualImpl = compilation.generatedSourceFile("com.lh.test.annotationprocessor.value.PersonNEW").orElseThrow()
                .getCharContent(false).toString();

        JavaFileObject resultJavaFileObject = JavaFileObjects.forResource("result/PersonNEW.java");
        String result = resultJavaFileObject.getCharContent(false).toString();

        MatcherAssert.assertThat(actualImpl.lines().toArray(), is(result.lines().toArray()));
    }
}