Предположим есть несколько классов 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?
А вот сколько тестов написать - это уже философский вопрос. Но одного обычно мало бывает.
Комментариев нет:
Отправить комментарий