top 12 mockito interview questions
Найпоширеніші запитання інтерв’ю Mockito для злому глузливого інтерв’ю Mockito:
У нашому попередньому підручнику ми дізналися Приватні, статичні та порожні методи знущань . Прочитайте повні навчальні посібники з Mockito для чіткого розуміння структури Mockito.
Ця стаття охоплює найчастіше задані типові запитання щодо інтерв’ю в рамках Mockito Mocking.
Очікується, що кожен розробник або перевірка якості знає основи глузування, щоб легко писати більшість білих тестів (або модульних тестів) та висміювати залежності для розширеного охоплення коду та більшої довіри до програми.
Найпопулярніші запитання інтерв’ю Mockito з докладними відповідями
Нижче наведено найпоширеніші запитання щодо Mocking Frameworks.
Q # 1) Навіщо нам потрібно глузувати?
Відповідь: Існує багато випадків використання знущань, які допомагають у модульному тестуванні ізольованого коду і роблять тест дуже повторюваним та передбачуваним.
Знущання зазвичай потрібне, коли:
до) Випробовуваний компонент має залежності, які ще не реалізовані або впровадження триває.
Хорошим прикладом може бути кінцева точка REST API, яка стане доступною пізніше, але ви використали її в коді через залежність.
Зараз, оскільки реальна реалізація все ще недоступна, ви справді більшу частину часу знаєте, яка очікувана відповідь цього API. Знущання дозволяють перевірити такі види інтеграції.
б) Компонент оновлює стан у системі.
Приклад: Виклики БД - ви не хочете оновлювати свою БД даними, призначеними лише для тестування. Це може призвести до пошкодження даних, більше того, наявність БД є ще однією проблемою під час виконання тесту.
Таким чином, щоб уникнути такої поведінки, дзвінки DB можуть висміюватись у тестованому компоненті. Отже, немає прямого зв’язку БД і випробовуваного компонента.
Q # 2) Різниця між doReturn і thenReturn.
Відповідь: Mockito пропонує два різні синтаксиси для створення заглушок, таких як:
- doReturn, а потімReturn
- не робити нічого (не тоді нічого)
- doThrow, а потімThrow
Обидва ці методи налаштовують заглушки і можуть використовуватися для створення / налаштування заглушок, а іноді можуть використовуватися як взаємозамінні.
найкращий безкоштовний DVD ripper для Windows
То як же обидва вони відрізняються?
до) Спосіб заглушення thenReturn - це безпечний спосіб налаштування заглушок. Це по суті означає, що він виконує перевірку часу компіляції щодо типів повернення, які ви також хочете заглушити.
Давайте розберемося в цьому на прикладі:
Припустимо метод getItemDetails на mockedItemService який повертає об'єкт типу ItemSku. Так і з thenReturn, ви не зможете повернути нічого, крім типу ItemSku, але за допомогою doReturn ви можете налаштувати заглушку, щоб повернути що-небудь, і тест не вдасться (або видасть виняток) під час виконання.
// працює
when (mockedItemService.getItemDetails(123)).thenReturn(new ItemSku());
// викидає виняток часу компіляції
when (mockedItemService.getItemDetails(123)).thenReturn(expectedPrice);
// з doReturn обидва налаштування заглушки працюють, оскільки не є безпечним для компіляції.
// тут ми намагаємось повернути об'єкт типу double, який все ще працює і не видає жодного попередження про час компіляції.
doReturn (expectedPrice).when(mockedItemService.getItemDetails(123)); doReturn (new ItemSku()).when(mockedItemService.getItemDetails(123));
б) Ще одна важлива різниця між цими двома шляхами до заглушки полягає у знущаних об'єктах, крім безпеки компіляції, особливої різниці немає.
Однак для об'єктів, що шпигують, установка заглушки типу 'thenReturn' не буде працювати, оскільки це призведе до виклику реального методу до того, як затуплена відповідь повернеться як виклик і не на Mock, а на Spy, який обертає реальний екземпляр об'єкта .
Тож припустимо, є шпигун на ім’я spiedObject, і він має метод testMethod, який повертає ціле число, тоді для встановлення заглушки на цьому вам потрібно буде використовувати doReturn замість thenReturn.
doReturn (10).when(spiedObject.testMethod());
Q # 3) Коли і чому слід використовувати шпигуна?
Відповідь: Шпигун - це тип часткового знущання, що підтримується Mockito.
Це, по суті, означає тип екземпляра, де:
до) Коли жоден макет не налаштований, будь-яка взаємодія з шпигуном призводить до виклику реальних методів. Але це все одно дозволяє перевірити взаємодію з об'єктом, який підглядається, наприклад - чи був метод фактично викликаний, скільки разів метод був викликаний, які аргументи використовували, який метод був викликаний тощо.
б) Це дає вам можливість гнучко налаштовувати часткові знущання.
Наприклад, якщо у вас є об’єкт із 2 методами - method1 та method2, і ви хочете, щоб метод1 викликався, а метод2 знущався. Шпигуни забезпечують таку установку.
Отже, різниця між макетом та заглушкою простими словами полягає в тому, що макет створюється з типу, а не з екземпляра, тоді як заглушка обгортає фактичний екземпляр об'єкта класу.
Q # 4) Чому не можна висміяти статичні методи за допомогою Mockito?
невизначене посилання на функцію c ++
Відповідь: Статичні методи пов'язані з самим класом, а не з якимсь конкретним екземпляром класу. Це означає, що всі екземпляри / об'єкти класу використовують один і той же екземпляр статичного методу.
Статичні методи більше нагадують процедурний код і в основному використовуються в застарілих системах загалом.
Бібліотеки фіксів зазвичай створюють фальшивки шляхом динамічного створення екземпляра під час виконання, або через інтерфейси, або через успадкування, і оскільки статичний метод не пов'язаний з жодним конкретним екземпляром, неможливо для макетних фреймворків (таких як mockito, easy mock тощо) знущатися над статичними методами.
Такі фреймворки, як PowerMock, які мають підтримку статичних методів, виконують маніпуляції з байт-кодом під час виконання, щоб знущатися зі статичних методів.
Q # 5) Що потрібно для того, щоб переконатися, що виклик був випущений?
Відповідь: Налаштування заглушки на знущаний об'єкт (або підглянутого екземпляра) не гарантує, чи було навіть викликане заглушене налаштування.
'Верифікаційні' збіги, надають можливість перевірити, чи справді був запущений заглушок, чи ні, скільки разів був зроблений виклик, з якими аргументами викликався метод stub і т.д.
По суті, це дозволяє нам більш надійно перевірити налаштування тесту та очікуваний результат.
Q # 6) Що таке хороший тестований код?
Відповідь:
Кілька пунктів про тестований код (мається на увазі, який можна було б легко протестувати):
- Зменшення кількості залежностей або щільне зчеплення - Приклад: Залежності слід вводити, а не інстанціювати безпосередньо.
- Кодекс, який дотримується SRP (Принцип єдиної відповідальності) - Це по суті означає, що у класу не повинно бути декількох причин змінюватися. Дотримання SRP дозволяє уникнути класів, створюючи залежність від себе, і підтримує цілісність і чистоту коду.
- Менше / мінімальне використання статичних методів та підсумкових класів - Вони, як правило, вказують на запахи коду і в основному були пов’язані із застарілим кодом.
Q # 7) Які обмеження Mockito?
Відповідь: Mockito - це рамка вибору для більшості java-проектів. Це легко впровадити, прочитати та зрозуміти.
Деякі недоліки або обмеження з точки зору функціональності:
- Його нездатність знущатися зі статичних методів.
- Конструктори, приватні методи та підсумкові класи не можна глузувати.
Q # 8) Які фреймворки можуть підтримувати знущання над приватними та статичними методами?
Відповідь: Такі фреймворки, як PowerMockito (розширення фреймворку Mockito), JMockit тощо забезпечують засоби для знущань над приватними та статичними методами.
Q # 9) Знущання / придушення методів за замовчуванням в Інтерфейсі в Java 8.
Відповідь: Завдяки реалізації методів Java 8 за замовчуванням в інтерфейсі, Mockito надає готову підтримку для знущань над такими методами за замовчуванням. (Зверніть увагу, що ця підтримка була представлена з Mockito 2 і далі).
З цих методів можна глузувати / глушити, як із будь-якими іншими методами класу чи інтерфейсу.
Q # 10) Як можна перевірити порядок викликів заглушки в Mockito?
Відповідь: Коли ви хочете перевірити порядок, у якому викликали глузування, Mockito's “ В порядку ”Може бути використаний інтерфейс.
Під час тесту вам просто потрібно налаштувати / створити об'єкт Inorder, перерахувавши список макетних об'єктів, щодо яких слід встановити порядок макетів (якщо в одному макеті є кілька методів, і немає іншого макетного, що потребує для перевірки тоді достатньо згадати знущаний клас лише один раз).
Розглянемо тест, наведений нижче, який визначає об’єкт InOrder та згадує 2 випадки mockDatabaseImpl
@Test public void calculateSumAndStore_withValidInput_verifyMockOrder() { // Arrange studentScores = new StudentScoreUpdates(mockDatabaseImpl); int() scores = {60,70,90}; Mockito.doNothing().when(mockDatabaseImpl).updateScores(anyString(), anyInt()); Mockito.doReturn('A').when(mockDatabaseImpl).getGrade(anyInt()); InOrder inorder = inOrder(mockDatabaseImpl); // Act studentScores.calculateSumAndStore('Student1', scores); // Assert inorder.verify(mockDatabaseImpl).updateScores(anyString(),anyInt()); inorder.verify(mockDatabaseImpl).getGrade(anyInt()); }
Крім того, для довідки корисно зрозуміти порядок виконання тесту: перелік коду тестованого методу:
public void calculateSumAndStore(String studentId, int() scores) { int total = 0; for(int score : scores) { total = total + score; } // write total to DB databaseImpl.updateScores(studentId, total); databaseImpl.getGrade(total); }
Як видно вище, databaseImpl спочатку викликає updateScores, а потім викликає getGrade.
Отже, якщо ви пишете модульний тест за допомогою Mockito, для цього вам потрібно забезпечити порядок викликів на databaseImpl, зверніться до тестового коду та переконайтеся, що твердження зроблені відповідно до очікуваного порядку.
У наведеному вище прикладі, якщо я змінив порядок тверджень, це призведе до невдалого тесту, за винятком “VerificationInOrderFailure”.
Після зміни порядку затвердження код виглядає, як показано нижче:
@Test public void calculateSumAndStore_withValidInput_verifyMockOrder() { // Arrange studentScores = new StudentScoreUpdates(mockDatabaseImpl); int() scores = {60,70,90}; Mockito.doNothing().when(mockDatabaseImpl).updateScores(anyString(), anyInt()); Mockito.doReturn('A').when(mockDatabaseImpl).getGrade(anyInt()); InOrder inorder = inOrder(mockDatabaseImpl); // Act studentScores.calculateSumAndStore('Student1', scores); // Assert inorder.verify(mockDatabaseImpl).updateScores(anyString(),anyInt()); inorder.verify(mockDatabaseImpl).getGrade(anyInt()); }
Вищезазначене виконання тесту видає виняток із типом:
“VerificationInOrderFailure” org.mockito.exceptions.verification.VerificationInOrderFailure:
Помилка перевірки замовлення
Розшукується, але не викликається:
mockDatabaseImpl.updateScores (
isA (java.lang.String),
isA (java.lang.Integer)
Q # 11) Повернення кількох значень щодо послідовних викликів методів
Відповідь: Для повернення різних значень для кількох викликів одного і того ж методу з обмеженою здатністю Mockito пропонує 3 підходи, як зазначено нижче:
до) Використання розділених комами: Це працює з thenReturn.
Наприклад , взявши наведений вище зразок коду, спробуємо встановити послідовну заглушку для методу - getGrade, який повертатиме різні значення в залежності від послідовності ітерацій:
when (mockDatabaseImpl.getGrade( anyInt ())).thenReturn('A','B', 'C');
Це означає, що при виклику методів getGrade у тестованому методі перший виклик повертає “A”, другий виклик повертає “B” тощо.
c ++ функція сортування міхурів
б) Послідовний Повернення: Це підхід, який поєднаний із операторами thenReturn. Застосування ланцюгових викликів до того ж прикладу буде виглядати, як показано нижче.
when (mockDatabaseImpl.getGrade( anyInt ())).thenReturn('A').thenReturn('B').thenReturn('C');
в) Послідовний повернення: Останній підхід - використання doReturn у ланцюговому форматі, як зазначено вище.
doReturn ('A').doReturn('B').doReturn('C').when(mockDatabaseImpl).getGrade( anyInt ())
Q # 12) Які існують різні типи глузуючих фреймворків і як вони працюють?
Відповідь: Типи фреймворку Mocking і як вони працюють описано нижче.
Існує в основному 2 категорії насмішкуючих фреймворків:
- На основі проксі - Приклад, Mockito, EasyMock тощо.
- На основі байт-коду - Приклад, PowerMock, JMockit тощо.
Давайте порівняємо обидва ці фреймворки за різними параметрами.
На основі проксі | На основі байт-коду | |
---|---|---|
Просто | Більш простий і простий у використанні | Може включати складну фіктивну логіку налаштування |
Режим створення | Створюється проксі або фальшивий об'єкт, який насправді не вимагає екземпляра класу / інтерфейсу | По суті, це включає створення об'єктів і під час виконання маніпулює екземплярами для знущання / нечіткої поведінки |
Функціональність | Знущальні класи та інтерфейси | На додаток до класів та інтерфейсів, дозволяє знущатися над статичними методами, фінальними класами тощо |
Залежність від Java | Не дуже тісно пов'язані з версіями Java | Оскільки ці фреймворки передбачають маніпуляції з байт-кодом, вони тісно пов'язані і можуть не бути сумісними назад / вперед у версіях Java. |
Приклади | Mockito, EasyMock тощо | PowerMock, JMockit тощо |
Висновок
Зміст, викладений у цій статті, пропонує основні дискусії навколо насмішкуючих фреймворків та, зокрема, підготовки інтерв’ю Mockito.
Окрім теоретичного розуміння висвітлених питань, слід також спробувати зробити реальні приклади коду, що робить вивчення цих фреймворків більш цікавим та цікавим.
Сподіваюся, вам сподобався весь набір підручників у цій серії Mockito.
Щасливого навчання.
НАЗАД Підручник | ПЕРШИЙ підручник
Рекомендована література
- Запитання та відповіді на інтерв’ю
- Підручник Mockito: Mockito Framework для знущань під час модульного тестування
- Деякі цікаві запитання щодо тестування програмного забезпечення
- Запитання та відповіді на інтерв’ю для тестування ETL
- Найпопулярніші запитання для інтерв’ю щодо форм та звітів Oracle
- Тестування запитів на інтерв’ю для досвідчених професіоналів
- Найпопулярніші технічні запитання щодо програм Oracle та запитання щодо інтерв’ю Oracle SOA
- 25 найкращих запитань та відповідей на інтерв’ю для спритного тестування