Использовать инжектор конструктора при использовании @Assisted
инъекция
Вики-страница Guice's Assisted Injection упоминает:
AssistedInject автоматически генерирует реализацию фабричного класса.Чтобы использовать его, аннотируйте конструктор класса реализации и поля, которые не известны инжектору:
И позже:
AssistedInject отображает метод create ()параметры к соответствующим @Assisted
параметрам в конструкторе класса реализации. Для других аргументов конструктора он запрашивает у обычного инжектора значения.
Поскольку они доступны только в это время, Guice будет вводить поля только после вызов конструктора.Это означает, что вы должны использовать инжектор конструктора , и никакой другой механизм (если у вас нет расширения, которое позволяет @PostConstruct
или подобное).
Итак, давайте перепишем вашкод в соответствии с этим.Напишите свой RealWorkWindow
следующим образом:
@Singleton
public class RealWorkWindow implements WorkWindow {
private final WorkWindow defaultWindow;
private final WorkWindow workWindow;
@Inject
public RealWorkWindow(Factory myFactory, @Assisted LongSupplier longSupplier) {
defaultWindow = myFactory.create(() -> 1000L);
workWindow = myFactory.create(longSupplier);
}
}
Ваш код может стать тестируемым следующим образом:
@RunWith(MockitoJunitRunner.class)
public class RealWorkWindowTest {
@Mock
Factory myFactory;
@Mock
WorkWindow defaultWindow;
@Mock
WorkWindow workWindow;
RealWorkWindow realWorkWindow;
@BeforeEach
void setup() {
when(myFactory.create(any(LongSupplier.class)))
.thenReturn(defaultWindow) // First call
.thenReturn(workWindow); // Second call
realWorkWindow = new RealWorkWindow(myFactory, () -> 1000L);
}
}