як перевірити, що викликається метод, що не є фіктивним?


103

Здається, mockito лише перевіряє, чи викликається метод макетного об'єкта, і макетний об'єкт завжди має щось подібне doReturn().when(mock object)

Але чи можу я створити фіктивний об'єкт і визначити, doReturn().when(mock object) а потім перевірити, що викликається метод іншого об'єкта?

Ось що я хочу зробити: я визначаю mockEnvironment і повертаю відповідь незалежно від того, що трапиться. Але тоді я хочу перевірити різні методи виклику іншогоObj у різних випадках.

Як це зробити?

public class BaseClass {
    private Environment mockEnvironment;
    @Test
    public void testcase () {
     setMockitoEnvironment(); 
     response = foo(mockEnvironment, argument1);
     verify(anotherObj).codePath1(...);
     response = foo(mockEnvironment, argument2);
     verify(anotherObj).codePath2(...);
   }
}

//this method successfully return a response with any input 
//because I do not care how response is eventually generated, 
//I only care whether code path reaches createResponse() via 
//code path 1 or code path 2.
private void setMockitoEnvironment() {
    mockEnvironment = mock(Environment.class);
    doReturn (response).when(mockEnvironment).createResponse(for any input);
}
private Response foo(...) {
    ... 
    return createResponse(...);
}

Відповіді:


121

Для цього можна використовувати шпигуна Mockito . Якщо ви встановите anotherObjяк шпигуна, ви можете перевірити виклики методів для цього об'єкта. У вашому прикладі вам потрібно переконатися, що дзвінок до fooвикористовує шпигуна, а не звичайну реалізацію anotherObj. Шпигун налаштовує приблизно так:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);

Це означає, що мені може знадобитися створити та ввести кілька знущаних об'єктів, якщо я хочу перевірити кілька речей? що не зручно.
user389955

@ user389955 так, вам потрібно налаштувати кожен об'єкт, який ви хочете перевірити як шпигуна. Наскільки я знаю, цього ніяк не обійти. Mockito потрібно додати проксі до об'єктів, і хтось повинен сказати Mockito, які об'єкти для проксі.
K Erlandsson

10
Замість того, щоб говорити "// робити речі", може бути корисно додати, що саме "anotherObjSpy" повинен зробити тестування виклику методу.
jwehrle

Дякую @jwehrle, вам потрібно використовувати anotherObjSpy у дзвінках, інакше тести не спрацюють.
Аргот

2

Примітьте не-фіктивний об'єкт до @Spyанотації, а потім перевірте наявність verify(). Перевірте це

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