Знущання над шпигунством у глузуючих рамках


131

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

Наприклад, дивлячись на Mockito , я бачу подібні речі, що робляться за допомогою шпигунів та знущань , але я не впевнений у відмінність між ними.



Відповіді:


157

Об'єкт макету повністю замінить макетований клас, повертаючи записані або значення за замовчуванням Ви можете створити макет із "тонкого повітря". Це те, що в основному використовується під час тестування одиниць.

Шпигуючи, ви берете існуючий об’єкт і «замінюєте» лише деякі методи. Це корисно, коли у вас величезний клас і хочете знущатися лише над певними методами (частковий глузування). Дозвольте мені процитувати документацію Mockito :

Ви можете створювати шпигунів з реальних об'єктів. Якщо ви використовуєте шпигуна, тоді називаються реальні методи (якщо тільки метод не був стертий).

Справжніх шпигунів слід використовувати обережно та епізодично , наприклад, при роботі зі спадковим кодом.

Коли сумніваєтесь, використовуйте макети.


1
Дякую! Це робить його набагато зрозумілішим. Тож знущання ніколи не делегують фактичному об'єкту, з якого знущаються ніколи , але роблять шпигуни.
Вівін Паліат

7
У макетів немає "фактичного об'єкта" - макет створюється ab initio.
Карл Манастер

4
Будь-яке пояснення, чому Mockito весь час застерігає від використання шпигунів? Я бачу, що вони кажуть на користь глузувань, але мені не зрозуміло, чому саме.
Метт

9
Я не впевнений, але, можливо, тому, що вони "Mockito", а не "Spyito": D
typoerrpr

16

Mockito попереджає, що часткове глузування не є хорошою практикою, і вам слід переглянути свою об'єктно-орієнтовану архітектуру. Шпигун (або часткове глузування) рекомендується перевірити застарілий код .


16

Спробую пояснити, використовуючи приклад тут:

// Difference between mocking, stubbing and spying
@Test
public void differenceBetweenMockingSpyingAndStubbing() {
    List list = new ArrayList();
    list.add("abc");
    assertEquals(1, list.size());

    List mockedList = spy(list);
    when(mockedList.size()).thenReturn(10);
    assertEquals(10, mockedList.size());
}

Тут у нас був початковий реальний об'єкт list, в який ми додали один елемент і очікуваний розмір був один.

Ми шпигуємо за реальним об'єктом, що означає, що ми можемо підказати, який метод слід стерти . Тож ми заявили, що заглушили метод - size()на шпигунському об'єкті, який поверне 10, незалежно від фактичного розміру.

Коротше кажучи, ви шпигуєте за реальним об'єктом і заглушите деякі методи .


2

Довідка: http://javapointers.com/tutorial/difference-between-spy-and-mock-in-mockito/

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

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


2

Об'єкти пустушки передаються навколо, але фактично ніколи не використовуються. Зазвичай вони просто використовуються для заповнення списків параметрів.

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

Заглушки надають консервовані відповіді на дзвінки, здійснені під час тесту, зазвичай взагалі не відповідають на те, що передбачено для тесту.

Шпигуни - це заглушки, які також записують певну інформацію на основі того, як їх називали. Однією з форм цього може бути послуга електронної пошти, яка записує, скільки повідомлень було надіслано.

Знущання - це те, про що ми говоримо тут: об’єкти, заздалегідь запрограмовані на очікування, які формують специфікацію дзвінків, які вони очікують приймати.

Макети - це не заготовки Мартіна Фаулера


1

Шпигуни мають два визначення. Один - це те, де називається справжній метод, інший, де не викликається функціональність і повертаються лише нульові або нульові еквівалентні значення, але були викликані методи, і вони записували стан, як правило, метод x називався y разів.


0

У Mockito, якщо ви присвоюєте будь-якому об'єкту змінну екземпляра Mock Object, це не впливає на Mock Object.

Але у випадку Spy, якщо ви присвоюєте будь-якому об’єкту примірну змінну Spy Object, то це впливає на Spy Object через Spy-дія, як модифікація об'єкта в реальному часі.

Для довідкового прикладу є

@RunWith(MockitoJUnitRunner.class)
public class MockSpyExampleTest {

    @Mock
    private List<String> mockList;

    @Spy
    private List<String> spyList = new ArrayList();

    @Test
    public void testMockList() {
        //by default, calling the methods of mock object will do nothing
        mockList.add("test");
        assertNull(mockList.get(0));
    }

    @Test
    public void testSpyList() {
        //spy object will call the real method when not stub
        spyList.add("test");
        assertEquals("test", spyList.get(0));
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.