Насмешка против шпионажа в насмешливых рамках


в насмешливый рамок, вы можете издеваться над объектом или шпионить за ним. В чем разница между ними и когда/должен ли я использовать один над другим? Например, глядя на мокито, я вижу, что подобные вещи делаются с помощью шпионов и насмешек, но я не уверен в различии между ними.

6 90

6 ответов:

макет объекта заменить издевались класс полностью, возвращая записанные или значения по умолчанию. Вы можете создать макет из "воздуха". Это в основном используется во время модульного тестирования.

при шпионаже вы берете существующий объект и" заменяете " только некоторые методы. Это полезно, когда у вас есть огромный класс и вы хотите только издеваться над определенными методами (частичное издевательство). Позвольте мне процитировать документация Mockito:

вы можете создавать шпионов реальных объектов. Когда вы используйте шпиона, то реальные вызываются методы (если метод не был заглушен).

настоящие шпионы должны быть использованы осторожно и изредка, например при работе с унаследованным кодом.

Если вы сомневаетесь, используйте насмешки.

Mockito предупреждает, что частичное издевательство не является хорошей практикой, и вы должны пересмотреть свою архитектуру OO. Spy (или частичное издевательство) рекомендуется для тестирования устаревшего кода.

можно попробовать объяснить, используя пример здесь.

// 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());
}

здесь у нас был начальный список реальных объектов, в который мы добавили один элемент и ожидали, что размер будет один.

мы видим реальный объект, означающий, что мы можем указать, какой метод должен быть заглушен. поэтому мы объявили, что мы заглушили метод - size() на объекте spy, который вернет 10, независимо от фактического размера.

в двух словах, вы будете шпионить реальный объект и заглушить некоторые из методов.

частичное издевательство может быть достигнуто как с помощью шпиона, так и с помощью макета. Для mock мы используем thenCallRealMethod для вызова фактического метода, где as spy по умолчанию вызывает фактический метод. Таким образом, оба достигают одной и той же цели частичного издевательства. однако рекомендуется использовать Spy для частичного издевательства.

когда мы используем макет, фактический экземпляр объекта не создается, но экземпляр оболочки с голыми костями класса создается для отслеживания взаимодействий. Тогда как в случае шпиона мы сами создайте экземпляр объекта, который будет использоваться шпионом. Поэтому использование Mockito Spy гарантирует, что реальные методы вызываются правильно.

например

public class EmployeePaymentService {

    EmployeePaymentService(
        final NamedParameterJdbcTemplate namedParameterJdbcTemplate)
        {
        this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
        }

    public int getNoOfWorkingDays(String empId)
    {
        //call some query
        int days=namedParameterJdbcTemplate.query();
            return days;                

    }
}

Если для единичного теста мы частично издеваемся над вышеуказанным EmployeePaymentService, используя макет как -

@Mock private EmployeePaymentService employeePaymentService;

и позже вызовите фактический метод getNoOfWorkingDays с помощью thenCallRealMethod следующим образом -

when(employeePaymentService.getNoOfWorkingDays(anyString())).thenCallRealMethod();                          
int returnedWrkingDays = employeePaymentService.getNoOfWorkingDays(empId);         

мы получаем java.ленг.NullPointerException в методе getNoOfWorkingDays, поскольку namedParameterJdbcTemplate никогда не инициализировался. Однако, если бы мы использовали Mockito шпион этот сценарий никогда не возникнет, потому что мы бы сами создали EmployeePaymentService с помощью конструктора с namedJdbcTemplate.

для более подробной информации проверьте этот post

шпионы имеют два определения. Во-первых, там, где вызывается реальный метод, другой, где не вызывается функциональность и возвращаются только нулевые или нулевые эквивалентные значения, но вызывались методы, и их состояние записывалось, как правило, метод x вызывался y раз.

ссылка:http://javapointers.com/tutorial/difference-between-spy-and-mock-in-mockito/

при использовании фиктивных объектов, поведение по умолчанию метода, когда не заглушка ничего не делать. Простые средства, если его метод void, то он ничего не будет делать при вызове метода или если его метод с возвратом, то он может вернуть null, пустой или значение по умолчанию.

в то время как в шпионских объектах, конечно, так как это реальный метод, когда вы не заглушаете метод, то он будет вызывать реальное поведение метода. Если вы хотите изменить и издеваться над методом, то вам нужно заглушить его.