Предположим, что у вас есть три класса A
, B
и C
где A
называет B
и B
вызывает C
и каждый класс имеет некоторое количество внутренних состояний, которые влияют на результат, заданный методами класса. Опишите, как использование Mockito может значительно уменьшить количество тестовых примеров для класса A.
Я новичок в mockito. Я вроде как получил концепцию mockito, но наткнулся на вышеупомянутый вопрос, для которого у меня нет ответа. Может кто-нибудь объяснить мне ответ?
благодаря
Mockito может помочь вам изолировать поведение класса, не зная внутренней работы сотрудничающего класса.
Предположим, что C
выглядит так:
public class C {
private B b;
public C (B b) {
this.b = b;
}
public boolean isLargerThanTen() {
return b.getSomeCalculation() > 10;
}
}
Теперь предположим, что вы тестируете C.isLargerThanTen()
. Без издевательств вам нужно будет знать, как именно построить B
чтобы его getSomeCalculation()
вернул такое число. Например:
A a = new A();
a.setSomething(1);
a.setSomethingElse(2);
B b = new B(a);
b.setAnotherThing(999);
b.setYetAnotherThing(888);
C c = new C(b);
assertTrue(c.isLargerThanTen());
Это проблематично на двух фронтах - во-первых, это громоздко. Во-вторых, это дает вам знать внутреннюю работу B
(и в этом случае A
, от которой зависит B
). Если бы B
изменил свою реализацию, C
тест сломался бы, хотя в C
нет ничего плохого, только с (плохим) способом его тест настроен.
Вместо этого, если вы используете насмешку, вы можете просто имитировать единственную часть поведения, о котором вы заботитесь, без хлопот понимания внутренних деталей реализации B
:
B b = Mockito.mock(B.class);
Mockito.when(b.getSomeCalculation()).thenReturn(11);
C c = new C(b);
assertTrue(c.isLargerThanTen());
Это звучит как домашнее задание, но преимущество использования фальшивой структуры, такой как Mockito, заключается в том, что она позволяет полностью отделять функциональность каждого компонента при выполнении тестов. То есть вам нужно только протестировать интерфейс, представленный A
и возможные сценарии (различные входы и т.д.), Потому что вы можете контролировать то, что делают издеваемые классы B
и C
Например, если вам нужно протестировать обработку ошибок в A
вы можете просто добавить свой объект-макет B
в исключение без фактического создания условия ошибки в B
, которое иначе вызвало бы исключение.
Короткий ответ заключается в том, что он дает вам большую степень контроля над тестируемым классом (и такими зависимостями классов) и позволяет имитировать реальные условия, которые в противном случае могли бы занять гораздо больше кода для генерации.