Відповіді:
Звичайна бібліотека Мокіто
import org.mockito.Mock;
...
@Mock
MyService myservice;
і
import org.mockito.Mockito;
...
MyService myservice = Mockito.mock(MyService.class);
походять з бібліотеки Mockito і є функціонально рівнозначними.
Вони дозволяють знущатися над класом чи інтерфейсом та записувати та перевіряти поведінку на ньому.
Спосіб використання анотації коротший, настільки кращий і часто бажаний.
Зауважте, що для активації анотацій Mockito під час виконання тестових викликів необхідно викликати
MockitoAnnotations.initMocks(this)
статичний метод.
Щоб уникнути побічного ефекту між тестами, рекомендується робити це перед кожним виконанням тесту:
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
Інший спосіб включення анотацій Mockito - це анотування тестового класу @RunWith
, вказавши те, MockitoJUnitRunner
що робить це завдання, а також інші корисні речі:
@RunWith(org.mockito.runners.MockitoJUnitRunner.class)
public MyClassTest{...}
Бібліотека весняного завантаження, що обгортає бібліотеку Mockito
Це дійсно клас весняного завантаження :
import org.springframework.boot.test.mock.mockito.MockBean;
...
@MockBean
MyService myservice;
Клас входить до spring-boot-test
бібліотеки.
Це дозволяє додавати Mockito макети навесні ApplicationContext
.
Якщо bean, сумісний із оголошеним класом, існує в контексті, він замінює його макетом.
Якщо це не так, це додає макет у контексті як боб.
Довідник Javadoc:
Анотація, яку можна використовувати для додавання макетів до Spring ApplicationContext.
...
Якщо будь-який існуючий один боб одного типу, визначений у контексті, буде замінений макетом, якщо не визначений існуючий боб, буде доданий новий.
Коли використовується класичний / простий Mockito та коли використовується @MockBean
від Spring Boot?
Експериментальні випробування призначені для тестування компонента у відриві від інших компонентів, а також тестування блоків - це якомога швидше з точки зору часу виконання, оскільки ці тести можуть виконуватися щодня десятки разів на машинах розробника.
Отже, ось проста інструкція:
Коли ви пишете тест, який не потребує ніяких залежностей від контейнера Spring Boot, класичний / звичайний Mockito - це наступний шлях: це швидко і сприяє ізоляції тестованого компонента.
Якщо для вашого тесту потрібно покластись на контейнер Spring Boot, і ви хочете також додати або знущатися над однією з бобів контейнера: @MockBean
від Spring Boot це шлях.
Типове використання весняного завантаження @MockBean
Поки ми пишемо тестовий клас з анотацією @WebMvcTest
(веб-тестовий фрагмент).
Документація Spring Boot дуже добре підсумовує:
Часто
@WebMvcTest
буде обмежено одним контролером і використовуватиметься в поєднанні з@MockBean
для забезпечення макетних реалізацій для необхідних співробітників.
Ось приклад:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@RunWith(SpringRunner.class)
@WebMvcTest(FooController.class)
public class FooControllerTest {
@Autowired
private MockMvc mvc;
@MockBean
private FooService fooServiceMock;
@Test
public void testExample() throws Exception {
Foo mockedFoo = new Foo("one", "two");
Mockito.when(fooServiceMock.get(1))
.thenReturn(mockedFoo);
mvc.perform(get("foos/1")
.accept(MediaType.TEXT_PLAIN))
.andExpect(status().isOk())
.andExpect(content().string("one two"));
}
}
@MockBean
буде замінювати боб у контексті програми, якщо боб, що оголошує той самий тип, уже визначений у вашій конфігурації Spring. А ін'єкція виконується в класі, де ви заявляєте, @MockBean.
механізми DI працюють таким чином: ви реєструєте об'єкт у контексті DI, а потім можете вводити об'єкт, на який посилається у контексті Spring, у конкретний клас. Ви не вводите об'єкт у контекст DI.
Зрештою, це легко пояснити. Якщо ви просто заглянете в javadocs анотацій, ви побачите різні:
@Mock: ( org.mockito.Mock
)
Позначте поле як макет.
- Дозволяє створювати макети зі скороченням.
- Зводить до мінімуму код створення макетів, що повторюються
- Робить тестовий клас більш читабельним.
- Полегшує читання помилку підтвердження, оскільки назва поля використовується для ідентифікації макета.
@MockBean: ( org.springframework.boot.test.mock.mockito.MockBean
)
Анотація, яку можна використовувати для додавання макетів до Spring ApplicationContext. Може використовуватися як анотація на рівні класу, або на полях у будь-яких
@Configuration
класах, або в тестових класах, що є@RunWith
SpringRunner.Макети можуть бути зареєстровані за типом або за ім'ям бобів. Будь-який існуючий один боб одного типу, визначений у контексті, буде замінений макетом, якщо не визначений існуючий боб, буде доданий новий.
Коли
@MockBean
він використовується в полі, а також буде зареєстрований у контексті програми, макет також буде введений у поле.
Mockito.mock ()
Його справедливе представлення
@Mock
.
@MockBean
і @Mock
що один буде вводити знущаються в Spring ApplicationContext
і інший не буде?