Разница между @Mock, @MockBean и Mockito.mock ()

При создании тестов и издевательских зависимостей в чем разница между этими тремя подходами?

  1. @MockBean:

    @MockBean MyService myservice; 
  2. @Mock:

     @Mock MyService myservice; 
  3. Mockito.mock ()

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

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

     import org.mockito.Mock; ... @Mock MyService myservice; 

    а также

     import org.mockito.Mockito; ... MyService myservice = Mockito.mock(MyService.class); 

    происходят из библиотеки Mockito и функционально эквивалентны.
    Они позволяют издеваться над classом или интерфейсом, а также записывать и проверять поведение на нем.

    Способ использования annotations короче, поэтому предпочтительнее и часто предпочтительнее.


    Обратите внимание, что для включения аннотаций Mockito во время тестовых исполнений необходимо MockitoAnnotations.initMocks(this) статический метод MockitoAnnotations.initMocks(this) .
    Чтобы избежать побочного эффекта между испытаниями, рекомендуется выполнить его перед каждым выполнением теста:

     @Before public void initMocks() { MockitoAnnotations.initMocks(this); } 

    Еще один способ включить annotations Mockito – аннотировать тестовый class с помощью @RunWith , указав MockitoJUnitRunner который выполняет эту задачу, а также другие полезные вещи:

     @RunWith(org.mockito.runners.MockitoJUnitRunner.class) public MyClassTest{...} 

    Библиотека загрузочной библиотеки Spring Boot Mockito

    Это действительно class Spring Boot :

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

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

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

    Ссылка на Javadoc:

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

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


    Когда вы используете classический / простой Mockito и когда используете @MockBean из Spring Boot?

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

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

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


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

    Когда мы пишем тестовый class, аннотированный с помощью @WebMvcTest (веб-тестовый fragment).

    Документация Spring Boot очень хорошо описывает это:

    Часто @WebMvcTest будет ограничиваться одним controllerом и использоваться в сочетании с @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. 
    Interesting Posts

    Android ICS 4.0 NDK NewStringUTF рушится в приложении

    Использование команды cd в командной строке Windows не может перейти к D: \

    Можно ли использовать тернарный / условный оператор Java (? :) для вызова методов вместо назначения значений?

    Flash-видео не отображается в WebView для Android 3.0.1

    Подавлять типы нулевых значений от испускания XmlSerializer

    Загрузка данных D3.js из простой строки JSON

    Передача массива в качестве аргумента функции в C

    Запуск активности из сервиса после нажатия кнопки HOME без задержки 5 секунд

    Ошибка Java: не удается сделать статическую ссылку на нестатический метод

    Есть ли способ использования ctrl-r после ввода части команды в bash?

    Разбор JSON с инструментами Unix

    Прямая передача файла между двумя компьютерами в Интернете

    string.split – с помощью множественного символьного разделителя

    .NET: Можно ли заставить HttpWebRequest автоматически распаковывать ответы gzip’d?

    iOS6 MKMapView с использованием тонны памяти, вплоть до сбоя приложения, кто-нибудь еще заметил это?

    Давайте будем гением компьютера.