Francislainy Campos
Francislainy Campos

Reputation: 4164

IntelliJ Unit Test Configuration fails with: "variable not initialized in the default constructor" Error When Using Lombok Annotation

Issue

I'm encountering the following error when running my project as a unit test configuration in IntelliJ:

/Users/francislainycampos/IdeaProjects/so-be-automation/src/test/java/com/francislainy/sobeautomation/steps/MySteps.java:14:30
java: variable restClient not initialized in the default constructor

However, the same tests work fine when I run mvn test from the terminal.

My Setup

RestClient.java
@Slf4j
@Component
@AllArgsConstructor
public class RestClient {
    public RequestSpecification getRequestSpecification() {
        // Rest Assured config here
    }
}
CucumberSpringConfiguration.java
@CucumberContextConfiguration
@SpringBootTest(classes = TestConfig.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class CucumberSpringConfiguration {}
TestConfig.java
@ComponentScan(basePackages = {"com.francislainy.sobeautomation"})
@EnableAutoConfiguration
public class TestConfig {}
MySteps.java
@RequiredArgsConstructor
public class MySteps {
    private final RestClient restClient;
    private Response response;

    @Given("I send a GET request to the Bored API")
    public void iSendAGETRequestToTheBoredAPI() {
        response = restClient.getRequestSpecification().get("https://www.boredapi.com/api/activity");
    }
}
pom.xml (Relevant Dependencies)
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-spring</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

What I've Tried

However, the only workaround I've found so far is to remove the @RequiredArgsAnnotation and explicitly define a constructor for my variable.

public class MySteps {
    private final RestClient restClient;
    private Response response;
    
    public MySteps(RestClient restClient) {
        this.restClient = restClient;
    }
}

Question

Why does @RequiredArgsConstructor fail to initialize restClient when running the tests in IntelliJ's unit test configuration, but works fine with mvn test? Is there a way to ensure the Lombok-generated constructor works correctly in both scenarios?

enter image description here

enter image description here

https://github.com/francislainy/so-be-automation

Thank you.

Upvotes: 2

Views: 80

Answers (2)

Geba
Geba

Reputation: 1122

The problem was in the Processor path - version of Lombok was unknown.
You need to set Processor path to the path of Lombok with the version you are using in your project.
Also no need to have enabled IntelliJ IDEA's Lombok plugin.

For example, I have $HOME/.m2/repository/org/projectlombok/lombok/1.18.30/lombok-1.18.30.jar.

The config so-be-automation/.idea/compiler.xml should look like this:

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <annotationProcessing>
      <profile name="Annotation profile for so-be-automation" enabled="true">
        <sourceOutputDir name="target/generated-sources/annotations" />
        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
        <outputRelativeToContentRoot value="true" />
        <processorPath useClasspath="false">
          <entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.30/lombok-1.18.30.jar" />
        </processorPath>
        <module name="so-be-automation" />
      </profile>
    </annotationProcessing>
  </component>
  <component name="JavacSettings">
    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
      <module name="so-be-automation" options="-parameters" />
    </option>
  </component>
</project>

Upvotes: 1

Francislainy Campos
Francislainy Campos

Reputation: 4164

Based on the conversation with @Geba, this is what has fixed the issue.

Changing Annotation profile from using Processor path

enter image description here

To using Obtain processor from project classpath.

enter image description here

Upvotes: 1

Related Questions