assertj-assertions-generator icon indicating copy to clipboard operation
assertj-assertions-generator copied to clipboard

Assertion compilation fails when class has a template field

Open dmitry-weirdo opened this issue 4 years ago • 0 comments

Generations plugin versions in maven:

            <plugin>
                <groupId>org.assertj</groupId>
                <artifactId>assertj-assertions-generator-maven-plugin</artifactId>
                <version>2.2.0</version>

Test class

package testassertj;

import lombok.Data;

@Data
public class TemplateClassField<T> {

    protected T model;
}

Generated assertion class:

package testassertj;

import org.assertj.core.api.AbstractObjectAssert;
import org.assertj.core.util.Objects;

/**
 * {@link TemplateClassField} specific assertions - Generated by CustomAssertionGenerator.
 */
@javax.annotation.Generated(value="assertj-assertions-generator")
public class TemplateClassFieldAssert extends AbstractObjectAssert<TemplateClassFieldAssert, TemplateClassField> {

  /**
   * Creates a new <code>{@link TemplateClassFieldAssert}</code> to make assertions on actual TemplateClassField.
   * @param actual the TemplateClassField we want to make assertions on.
   */
  public TemplateClassFieldAssert(TemplateClassField actual) {
    super(actual, TemplateClassFieldAssert.class);
  }

  /**
   * An entry point for TemplateClassFieldAssert to follow AssertJ standard <code>assertThat()</code> statements.<br>
   * With a static import, one can write directly: <code>assertThat(myTemplateClassField)</code> and get specific assertion with code completion.
   * @param actual the TemplateClassField we want to make assertions on.
   * @return a new <code>{@link TemplateClassFieldAssert}</code>
   */
  @org.assertj.core.util.CheckReturnValue
  public static TemplateClassFieldAssert assertThat(TemplateClassField actual) {
    return new TemplateClassFieldAssert(actual);
  }

  /**
   * Verifies that the actual TemplateClassField's model is equal to the given one.
   * @param model the given model to compare the actual TemplateClassField's model to.
   * @return this assertion object.
   * @throws AssertionError - if the actual TemplateClassField's model is not equal to the given one.
   */
  public TemplateClassFieldAssert hasModel(T model) {
    // check that actual TemplateClassField we want to make assertions on is not null.
    isNotNull();

    // overrides the default error message with a more explicit one
    String assertjErrorMessage = "\nExpecting model of:\n  <%s>\nto be:\n  <%s>\nbut was:\n  <%s>";

    // null safe check
    T actualModel = actual.getModel();
    if (!Objects.areEqual(actualModel, model)) {
      failWithMessage(assertjErrorMessage, actual, model, actualModel);
    }

    // return the current assertion for method chaining
    return this;
  }

}

Compilation fails on public TemplateClassFieldAssert hasModel(T model) { method:

[ERROR] /C:/java/myproject/target/generated-test-sources/assertj-assertions/testassertj/TemplateClassFieldAssert.java:[37,44] cannot find symbol
[ERROR]   symbol:   class T
[ERROR]   location: class testassertj.TemplateClassFieldAssert

Expected behaviour: Generated assert class is also <T> templated, so that hasModel(T model) compiles successfully.

dmitry-weirdo avatar Jul 13 '21 13:07 dmitry-weirdo