Вы не можете сделать это так, потому что вы тесно связаны с использованием «настоящего» класса C.
Вместо этого укажите Supplier<C>
(или, в более общем случае, Supplier<? extends C>
) дляКонструктор B
:
public class B extends A
{
private final Supplier<? extends C> cSupplier;
public B(Supplier<? extends C> cSupplier) {
this.cSupplier = cSupplier;
}
public void dial()
{
C c = cSupplier.get();
c.command();
}
}
Теперь вы можете передать экземпляр поставщика:
// In production code:
B b = new B(C::new);
// In test code:
B b = new B(() -> mock(C.class));