Как mockito помогает уменьшить количество тестов

1

Предположим, что у вас есть три класса A, B и C где A называет B и B вызывает C и каждый класс имеет некоторое количество внутренних состояний, которые влияют на результат, заданный методами класса. Опишите, как использование Mockito может значительно уменьшить количество тестовых примеров для класса A.

Я новичок в mockito. Я вроде как получил концепцию mockito, но наткнулся на вышеупомянутый вопрос, для которого у меня нет ответа. Может кто-нибудь объяснить мне ответ?

благодаря

  • 0
    Mockito не должен сокращать количество тестов. Это облегчает написание тестов для классов, которые зависят от других классов, путем насмешки над поведением зависимых классов.
Теги:
junit
mockito

2 ответа

3
Лучший ответ

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());
  • 0
    Большое спасибо ! Это действительно очень хорошее объяснение :)
2

Это звучит как домашнее задание, но преимущество использования фальшивой структуры, такой как Mockito, заключается в том, что она позволяет полностью отделять функциональность каждого компонента при выполнении тестов. То есть вам нужно только протестировать интерфейс, представленный A и возможные сценарии (различные входы и т.д.), Потому что вы можете контролировать то, что делают издеваемые классы B и C

Например, если вам нужно протестировать обработку ошибок в A вы можете просто добавить свой объект-макет B в исключение без фактического создания условия ошибки в B, которое иначе вызвало бы исключение.

Короткий ответ заключается в том, что он дает вам большую степень контроля над тестируемым классом (и такими зависимостями классов) и позволяет имитировать реальные условия, которые в противном случае могли бы занять гораздо больше кода для генерации.

  • 0
    Большое спасибо, Крис. Я имею в виду нечто подобное, но я не был уверен, что я думаю в правильном направлении.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню