В чем разница между Mockito.mock(SomeClass) и аннотацией @Mock?
В чем разница между методом Mockito.mock(Class<T> classToMock)
и аннотацией @Mock
?
Они одинаковы?
Например, это:
private TestClass test = Mockito.mock(TestClass.class);
то же самое, что:
@Mock
private TestClass test;
Ответы
Ответ 1
Они оба добиваются того же результата. Использование аннотации (@Mock
) обычно считается "более чистым", так как вы не заполняете свой код с помощью назначений шаблонов, которые выглядят одинаково.
Обратите внимание, что для использования аннотации @Mock
ваш тестовый класс должен быть аннотирован с помощью @RunWith(MockitoJUnitRunner.class)
или содержать вызов MockitoAnnotations.initMocks(this)
в методе @Before
.
Ответ 2
Разница в строках кода вам нужно написать:):):)
Серьезно, хотя использование аннотаций имеет тот же эффект, что и при использовании Mockito.mock.
Чтобы процитировать документацию MockitoAnnotations
, использование аннотаций имеет следующие преимущества:
-
Позволяет сокращать создание объектов, необходимых для тестирования.
-
Сведение к минимуму повторяющегося кода создания фотки.
-
Делает класс теста более удобочитаемым.
-
Делает ошибку проверки легче читать, потому что имя поля -
используется для идентификации макета.
javadoc для MockitoAnnotations
здесь
Ответ 3
Оба они считаются одинаковыми и достигают того же, но я предпочел бы второй:
@Mock - это аннотация, которая:
- Сведение к минимуму повторяющегося кода создания кода.
- Делает класс теста более удобочитаемым.
- Позволяет сокращать создание объектов, необходимых для тестирования.
Ответ 4
Есть два важных преимущества использования аннотации.
- Макет, созданный с помощью
@Mock
, может быть введен в тестируемый класс с помощью аннотации @InjectMocks
. Это мощный метод, который может значительно облегчить тестирование. Он просто не будет работать с mocks, созданным методом mock
.
- Если у вас есть ошибки, связанные с вашим макетом, в сообщении появится имя макета. Если вы использовали
@Mock
, то это имя будет просто именем поля. Это позволяет легко найти проблему макета.
Конечно, в дополнение к этим двум важным преимуществам большинство людей считают, что обозначение @Mock
более читаемо, и оно сокращает количество кода. Я не вижу причин не использовать его.
Ответ 5
Ответ на вопрос - одна большая ошибка.
Мы просто решили некоторые проблемы, вызванные Mockito.mock(Your.class) в качестве поля.
У нас было несколько методов @Test. Четвертый метод выбрал исключение с помощью 'thenThrow (ex)'. Все методы @Test после сбоя и причина была вызвана исключением. Они делили насмешливый пример и условие "когда". После того, как мы изменили с
TestClass testInstance = Mockito.mock(TestClass.class);
к
@Mock
TestClass testInstance;
все начало работать так, как ожидалось. Таким образом, Mockito.mock создает общий макет между методами тестирования, а @Mock - нет.