Тестування блоку методом недійсності


15

Щоб виправити помилку в додатку, я змінив метод, названий postLoginдодаванням виклику до існуючого методу з назвою getShoppingCart.

Код

protected void postLogin() {
  getShoppingCart();
}

Однак я не впевнений, який найкращий спосіб написати одиничний тест postLogin.

Підхід 1

Використовуйте verify від Mockito, щоб просто перевірити, чи був викликаний метод.

verify(mock).getShoppingCart();

Підхід 2

Перевірте побічний ефект виклику методу, отримавши значення кошика користувача.

AssertNotNull(user.getShoppingCart());

Чи один підхід кращий за інший?


1
залежно від того, що робить тест простішим для розуміння, і зберігає код чистим. Якщо ви не впевнені в тестовій конструкції, це може бути також ознакою того, що дизайн коду вимкнено. Переконайтеся, що ви задаєте ці запитання: " Чому додавання виклику методу виправляє помилку? Це ПРАВИЛЬНИЙ спосіб виправити цю помилку?"
Калеб

8
Якщо ваш getShoppingCart()метод не має побічних ефектів, вам не потрібно перевіряти, що він викликається. Якщо він має побічні ефекти, вам слід дійсно змінити його назву, оскільки getXXX()методи, як правило, мають бути безсильними.
Жуль

@Jules getNextValue? Можливо, хтось може сказати: «Не називайте це геттером; змініть ім'я на nextValue», але я бачив, що getNextраніше використовувався. Можливо, кращим прикладом може бути об’єкт, що представляє електрон; що відбувається, коли я телефоную getPosition? Або ще гірше,getPosition(); getVelocity();
Аарон

Відповіді:


18

Зазвичай я віддаю перевагу методу 2.

Чому? Тому що ви хочете postLoginзмінити деякий стан вашої системи, але те, як вона виконує це (і які методи він викликає для цього всередині) - це лише детальна інформація про реалізацію, нічого, про тест вашого модуля, не повинен робити жодних припущень. Тож краще зробіть свій тест лише перевіривши остаточний стан.


4

Я б змінив getShoppingCart на щось на кшталт InitializeShoppingCart, мета методу має бути зрозумілою для того, хто його читає, без необхідності перевіряти, що робить метод, і такі побічні ефекти, як це, можуть викликати дивовижне поведінку у користувачів методу.

Якщо getShoppingCart є в іншому класі, і він вже перевірений одиницею, я б застосував підхід 1 - не потрібно знову перевіряти те, що вже перевірено. У цьому випадку ми впевнені, що getShoppingCart працює належним чином, і ми хочемо лише запевнити, що він викликається з postLogin, тому якщо хтось у майбутньому видалить цей виклик, тест не вдасться.

Якщо getShoppingCart - це приватний метод, який неможливо перевірити самостійно, то я б застосував підхід 2, щоб переконатися, що коли postLogin викликається, потрібна функціональність getShoppingCart виконується так, як очікувалося.


1

Під час тестування виклику функції (недійсний чи ні), який має побічний ефект, найповніше перевірити, чи не виникає побічний ефект, а перевірити, чи потрібний побічний ефект (вихід системи або зміна стану).


1
Хоча це правда, варто також врахувати, що деталі побічного ефекту, які виникають, можуть бути частиною внутрішнього стану якогось іншого модуля, і що, перевіряючи ці деталі, ви з'єднаєте свій тест не лише з модулем, який це тестування, а також інший модуль, який може призвести до крихких тестів, якщо ці деталі, ймовірно, зміняться. Переміщення інтерфейсу між модулями допомагає запобігти цій проблемі.
Жуль

0

Я не буду обговорювати ваш дизайн, але у вашому випадку я б зайнявся першим підходом, тому що тестовий пристрій - це тестування того, які методи виконуються технічно незалежно від їх роботи в галузі, тобто що postLoginробить ваш метод ? Технічно це дзвінки, getShoppingCardтож вам доведеться перевірити, що насправді викликає getShoppingCard, я також створив би інший тест для getShoppingCardперевірки того, що він робить, і якщо він має побічні ефекти, я перевірю це всередині цього нового тесту.


0

У вас є помилка в postLogin. Отже, перше, що вам слід зробити, - це створити тестовий модуль, який при виклику postLogin без очікуваного набору інформації "провалиться".

З вищенаведеної ідеї, ще одна альтернатива із запропонованих 2 - ввести інформацію про кошик як параметр. Якщо у вас немає правильної інформації, ви кидаєте неперевірений виняток. Це дасть зрозуміти, що без правильних деталей ваш метод приречений.

Це потребує невеликих змін, коли клієнту, який зателефонував у postLogin, потрібно також передавати інформацію про кошик. Для мене це все ще є цілісним зараз, коли ви бачите, що вони з'єднані. Це з'єднання буде здійснено абонентом.

Тоді вам навіть не потрібно тестувати getShoppingCart всередині postLogin, оскільки реальним методом, який перевіряється, є postLogin. Це помилка та єдина, яка потребує належного виправлення та перевірки. За допомогою введеної залежності ви зможете легко протестувати її в різних умовах і підтвердити, що жодна помилка не допущена.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.