Mockito: когда какой-либо экземпляр вызывает метод, то возвращает что-то - PullRequest
0 голосов
/ 05 августа 2020

Я очень новичок в Mockito, и у меня есть такие классы, как

public class A {
   private B b;
   public B getB() { return b; }
   // ...
}

и

public class B {
   private C c;
   public C getC() { return c; }
   // ...
}

Я пишу модульные тесты, используя Mockito для класса A, и пытаюсь достичь следующее поведение, где B является имитацией:

when(a.getB().getC()).thenReturn(mock(C.class))
when(any(mock(C.class)).doSomething()).thenReturn("somethingElse") // This doesn't work.

Как я могу вернуть «somethingElse», когда какой-либо фиктивный экземпляр C вызывает doSomething ()? Я не хочу привязывать это поведение к какому-либо конкретному экземпляру mock (C .class).

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Прежде всего, вы должны относиться к вашему испытуемому как к единице и высмеивать все остальное. Итак, поскольку вы тестируете класс 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 использовать. Таким образом, вы можете заглушить этот объект с помощью имитационных функций.

0 голосов
/ 05 августа 2020

Не добавляйте mock (), который используется для создания новых моков.

Вот так

when(any(C.class).doSomething()).thenReturn("somethingElse");
...