Разница между @Mock, @MockBean и Mockito.издеваться()



при создании тестов и насмешливых зависимостей, в чем разница между этими тремя подходами?





  1. @MockBean:



    @MockBean
    MyService myservice;



  2. @ Mock:



    @Mock
    MyService myservice;



  3. Mockito.mock ()



    MyService myservice = Mockito.mock(MyService.class);


801   2  

2 ответов:

обычная библиотека Mockito

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 библиотека

это действительно a Весна Загрузки класс:

import org.springframework.boot.test.mock.mockito.MockBean;
...
@MockBean
MyService myservice;

класс включен в spring-boot-test библиотека.

это позволяет добавить Mockito издевается весной ApplicationContext.
Если Боб, совместимый с объявленным классом, существует в контексте, то он заменяет это макет.
Если это не так, то это добавляет макет в контексте объекта.

ссылка Javadoc:

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

...

если какой-либо существующий отдельный компонент того же типа определен в контексте будет заменен макет, если ни один существующий Боб не определен новый будут добавлены.


при использовании classic / plain Mockito и при использовании @MockBean от весеннего ботинка ?

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

следовательно, вот простое руководство :

когда вы пишете тест, который не нуждается в каких-либо зависимостях от контейнера Spring Boot, классический/простой Mockito-это способ следовать : он быстрый и способствует изоляции тестируемого компонента.
Если ваш тест должен полагаться на пружинный загрузочный контейнер и вы также хотите добавить или издеваться над одним из контейнерных бобов:@MockBean от Spring Boot-это путь.


типичное использование Spring Boot @MockBean

как мы пишем тестовый класс с аннотацией @WebMvcTest (срез веб-тестов).

документация по весенней загрузке резюмирует это очень хорошо:

часто @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"));
    }

}

в конце его легко объяснить. Если вы просто посмотрите в javadocs аннотаций вы увидите различия:

@ Mock: (org.mockito.Mock)

Mark a field as a mock. 
 - Allows shorthand mock creation. 
 - Minimizes repetitive mock creation code. 
 - Makes the test class more readable. 
 - Makes the verification error easier to read because the field name is used to identify the mock.

@MockBean: (org.springframework.boot.test.mock.mockito.MockBean)

Annotation that can be used to add mocks to a Spring ApplicationContext. Can be used as a class level annotation or on fields in either @Configuration classes, or test classes that are @RunWith the SpringRunner. 

Mocks can be registered by type or by bean name. Any existing single bean of the same type defined in the context will be replaced by the mock, if no existing bean is defined a new one will be added. 

When @MockBean is used on a field, as well as being registered in the application context, the mock will also be injected into the field.

Mockito.mock ()

Its just the representation of a @Mock. 

Comments

    Ничего не найдено.