Вам нужно будет куда-то переместить логику, создающую экземпляр bottom. Либо в переопределяемом методе, таком как:
public class top {
public top() {
bottom b = new bottom("value");
}
protected bottom createBottom() {
return new bottom("value");
}
}
И тогда вы можете переопределить его в тесте:
public class topTest {
@Test
public void test(){
top a = new top() {
protected bottom createBottom() {
return Mockito.mock(bottom.class);
}
};
}
}
Или вы создаете класс BottomCreator, передаете его Top во время создания и используете поддельную / поддельную версию при тестировании.
public class top {
private final BottomCreator bottomCreator;
public top(BottomCreator creator) {
this.bottomCreator = creator;
}
public top() {
bottom b = bottomCreator.newBottom();
}
}