Skip to content

AssistedInject factories should call their default methods without stubbing #1345

@ogregoire

Description

@ogregoire

I have a factory interface, extended by factory subtypes. The factories have default methods. So I would expect that they are called instead of whatever implementation is used.

Here's my full test case. Yes, I'm using a small hierarchy because that's actually part of my actual needs. It's probably not needed to showcase the error, though.

class DefaultMethodTest {

static class Foo { String str; @Inject Foo(@Assisted String str) { this.str = str; } }
static class Bar extends Foo { @Inject Bar(@Assisted String str) { super(str); } }

interface FooFactory {
	Foo create(@Assisted String str);
	default String id() { return "Foo"; }
}
interface BarFactory {
	Bar create(@Assisted String str);
	default String id() { return "Bar"; }
}
	
@Test
void testAssistedDefault() {
	var injector = Guice.createInjector(binder -> binder.install(new FactoryModuleBuilder().build(BarFactory.class)));
	var barFactory = injector.getInstance(BarFactory.class);
	assertThat(barFactory.id()).isEqualTo("Bar");
}
}

The assertion fails because the call returns the empty string "". It must be a default or something like that, I'm not entirely sure, but I would have expected that my default method is called.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions