Страницы

Поиск по вопросам

среда, 21 ноября 2018 г.

Что правильно тестировать в юнит-тестах?

Предположим есть несколько классов A, B и C. Мы тестируем A. Остальные классы - моки. У класса A есть метод, внутри которого он использует B и C, и выдает результат.
Нужно-ли тестировать то, что класс A взаимодействует с B и C, или написать один тест, в котором будет проверяться результат выполнения метода A?
Делать ли такой тест в следующем случае:
class A implements B.OnBarCallback { private B b;
public A(B b) { this.b = b; }
public void foo() { b.bar(this); }
@Override public void onBar() { // do something } }
// тест вызова B void testCallB() { B mockB = mock(B.class); A a = new A(mockB); a.foo(); verify(mockB).bar(any(OnBarCallback.class)); }
// тест callback void testACallback() { B mockB = mock(B.class); A a = new A(mockB); a.onBar(); // do verify something }
Правильно ли вручную дергать метод колбэка в тесте?


Ответ

Если пойти совсем по правилам, то юнит тест должен тестить минимальную единицу кода. У меня есть такое внутреннее правило - если мне вдруг понадобилось продебажить выполнение юнит теста, так как я не понимаю, как оно работает - значит, это не юнит тест, он тестирует слишком большой кусок кода.
Поэтому, если классы В и С достаточно большие и не тривиальные (к примеру, они читают файлы с диска, скачивают с интернета), то лучше их замокать и в классе A тестить с моками. А если методы B/C складывают два числа, то я не вижу особой причины их мокать.
Нужно-ли тестировать то, что класс A взаимодействует с B и C
Но никто не отменяет тестов взаимодействия классов вместе. Просто это называется уже интеграционные тесты. И они также нужны и полезны.
или написать один тест, в котором будет проверяться результат выполнения метода A?
А вот сколько тестов написать - это уже философский вопрос. Но одного обычно мало бывает.

Комментариев нет:

Отправить комментарий