Прежде всего, вы должны относиться к вашему испытуемому как к единице и высмеивать все остальное. Итак, поскольку вы тестируете класс A
, вы не можете издеваться над методами A
s.
Вот как вы могли бы использовать Mockito для имитации экземпляра B
с использованием аннотаций:
@MockitoSettings
public class ATest {
@Mock
private B b;
@InjectMocks
private A a;
@Test
void testExample() {
C c = mock(C.class):
when(b.getC()).thenReturn(c);
when(c.doSomething()).thenReturn("somethingElse");
// a.getB() == b
}
}
Итак, что здесь происходит?
Аннотация @Mock
инициализирует фиктивный объект типа B
и устанавливает для него переменную поля b
.
@InjectMocks
собирает все @Mock
поля и установка полей в объекте. Это ваш испытуемый.
Теперь в вашем экземпляре A
есть фиктивный объект B
. А внутри B у вас есть C
. Поскольку B
является имитацией объекта, метод getC()
вообще ничего не делает. Придется заглушить какой-то функционал. В тесте я инициализировал локальный фиктивный экземпляр C
, который должен быть возвращен из getC()
.
Итак, теперь, когда объект A
обращается к макету B
и получает C
, он получит эту локальную переменную c
использовать. Таким образом, вы можете заглушить этот объект с помощью имитационных функций.