Рубрики
Без рубрики

Мок-Шпион – Частичный Мок

Метод шпиона Mockito, пример аннотации Mockito @Spy, частичный макет Mockito, шпион Mockito против метода doCallRealMethod(), реальный метод вызова Mockito, учебник mokito.

Автор оригинала: Pankaj Kumar.

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

Насмешливый Шпион

Мы можем создавать объекты-шпионы mockito двумя способами.

  1. Метод Mockito.spy()
  2. Mockito @Шпионская аннотация

Пример метода Mockito spy()

Ниже приведен простой пример использования метода Mockito spy () .

package com.journaldev.mockito.spy;

import static org.mockito.Mockito.*;

import java.util.ArrayList;
import java.util.List;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class MockitoSpyExample {

	@Test
	void test() {
		List list = new ArrayList<>();
		List spyOnList = spy(list);

		spyOnList.add("A");
		assertEquals(1, spyOnList.size());
		assertEquals("A", spyOnList.get(0));

		spyOnList.add("E");
		assertEquals(2, spyOnList.size());
		assertEquals("E", spyOnList.get(1));

		when(spyOnList.size()).thenReturn(10);
		assertEquals(10, spyOnList.size());
	}
}

Обратите внимание, что add () , get() и size() методы реальных реализаций вызываются до тех пор, пока они не будут заглушены. В более поздний момент времени мы заглушили size() метод. С этого момента и далее будет вызываться метод stubbed.

Пример аннотации Mockito @Spy

Вот пример аннотации @Spi , мы преобразовали вышеуказанную тестовую программу для использования аннотации @Spy.

package com.journaldev.mockito.spy;

import static org.mockito.Mockito.*;

import java.util.ArrayList;
import java.util.List;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;

import static org.junit.jupiter.api.Assertions.*;

public class MockitoSpyAnnotationExample2 {

	@Spy 
	List spyOnList = new ArrayList<>();
	
	@BeforeEach
	public void setup() {
		MockitoAnnotations.initMocks(this);
	}
	
	@Test
	void test() {
		spyOnList.add("A");
		assertEquals(1, spyOnList.size());
		assertEquals("A", spyOnList.get(0));
		
		spyOnList.add("E");
		assertEquals(2, spyOnList.size());
		assertEquals("E", spyOnList.get(1));

		when(spyOnList.size()).thenReturn(10);
		assertEquals(10, spyOnList.size());
	}
}

Когда нам приходится повторно использовать объект speed в нескольких местах, лучше использовать аннотацию @Spy.

Обратите внимание, что необязательно создавать объект-шпион с помощью другого экземпляра, ниже также приведено приемлемое использование.

List spyOnList = spy(List.class);

@Spy 
List spyOnList1;

Тем не менее, рекомендуется обеспечить реализацию. Потому что в этом случае Mockito попытается создать экземпляр макетного объекта с помощью конструктора без аргументов . Кроме того, он не будет создавать экземпляры внутренних классов, локальных классов и т. Д. И мы знаем, что классы реализации списка используют внутренние классы. Таким образом, вы не получите ожидаемых результатов от своих тестов.

Mockito Шпион против doCallRealMethod()

Мы также можем использовать doCallRealMethod() на фиктивном объекте для вызова реального метода, однако рекомендуется использовать Spy для создания частичных насмешек. Потому что в Spy мы создаем экземпляр объекта, тогда как, когда мы создаем макет объекта, Mockito создает минимальный экземпляр объекта. Велика вероятность того, что требуемые зависимости не будут инициализированы при создании макета, что приведет к ошибочным результатам.