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

Feature: Create "unwrapped" overload for `hasX` if X is a value type

Open reitzig opened this issue 5 years ago • 2 comments

This is potentially a little vague in its broadness, but here goes.

Say we have a value class like e.g.

@Value
class AccountNumber {
    String rawValue;
}

If another class (for which we generate assertions) has a property of this type, we can assert:

assertThat(someObject).hasAccountNumber(new AccountNumber("abc"))

Nicer would be:

assertThat(someObject).hasAccountNumber("abc")

The generator could look for constructors, static _.of methods, and other popular patterns. It's not clear to me if there should be a limit on the length of the parameter list. Anyway, the desired implementation seems straight-forward:

public S hasAccountNumber(String accountNumberRawValue) {
   return hasAccountNumber(new AccountNumber(fooRawValue));
}

As an alternative, there could be an annotation like e.g.

@AssertionAlias
static Foo of(String rawValue) { ... }

On a property Foo bar, this would cause additional generation of something like

public S hasBar(String fooRawValue) {
   return hasBar(Foo.of(fooRawValue));
}

PS: This is probably easily done for specific use cases in any given project using templates, but I don't see documentation for a way to inject custom templates when using the generator through the Maven plugin.

reitzig avatar Aug 17 '20 11:08 reitzig

Never mind my PS: https://joel-costigliola.github.io/assertj/assertj-assertions-generator-maven-plugin.html#custom-templates

The configuration seems very specific, though; on first glance, I don't see how to tell the generator "if the property has type X, use this template instead/also".

reitzig avatar Aug 17 '20 11:08 reitzig

I think #220 would be a neater, more generally applicable alternative. Of course, we couldn't get back to the original Assert once we "descend" into the one of the property, so there may be independent value of unwrapping single-property classes/records.

reitzig avatar Aug 02 '24 10:08 reitzig