assertj / assertj-assertions-generator

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

Feature: Generate IterableAsserts for all generated Asserts #219

Open reitzig opened 2 months ago

reitzig commented 2 months ago

We would like to write something like this:

List<Foo> result;
assertThat(result).singleElement().hasName("Fool")

Now, we can generate FooAssert with the generator, but the ListAssert we get out of assertThat in this case does, of course, not known about the generated assertion; we get a regular ObjectAssert<Foo>.

We can work around this by creating something like this here:

public class FooIterableAssert
  extends AbstractIterableAssert<FooIterableAssert, Iterable<? extends Foo>, Foo, FooIterableAssert> {

  protected FooIterableAssert(Iterable<? extends Foo> foos, Class<?> selfType) {
    super(foos, selfType);
  }

  @Override
  protected FooAssert toAssert(Foo value, String description) {
    return new FooAssert(value);
  }

  @Override
  protected FooIterableAssert newAbstractIterableAssert(Iterable<? extends Foo> iterable) {
    return new FooIterableAssert(iterable, FooIterableAssert.class);
  }

  public static FooIterableAssert assertThat(List<Foo> foos) {
    return new FooIterableAssert(foos, FooIterableAssert.class);
  }
}

This has the feel of "should be a template" and "surely not only we want this", so I'm raising this issue. :) I'm also not sure whether one would have/want to fiddle with the entrypoint methods in support of this.

PS: I was considering to use Lombok's @ExtensionMethod on ListAssert to add something like FooAssert singleFoo() to it. Unfortunately, it does not seem possible to get the actual value back from an Assert, so I was stuck there.