assertj / assertj-assertions-generator

Custom assertions generator
https://joel-costigliola.github.io/assertj/assertj-assertions-generator.html
Apache License 2.0
62 stars 42 forks source link

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

Open reitzig opened 4 years ago

reitzig commented 4 years ago

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 commented 4 years ago

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 commented 3 months ago

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.