@RunWith (MockitoJUnitRunner.класс) против MockitoAnnotations.initMocks (это)
при написании нового теста jUnit4, мне интересно, следует ли использовать @RunWith (MockitoJUnitRunner.класс) или MockitoAnnotations.initMocks(это).
Я создал новый тест и мастер автоматически сгенерировал тест с Бегуном. Javadocs для MockitoJUnitRunner утверждают следующее:
совместимый с JUnit 4.4 и выше, этот бегун добавляет следующее поведение:
инициализирует издевается аннотированный с макетом, так что явное использование MockitoAnnotations.initMocks (объект) не требуется. Насмешки инициализируются перед каждым методом тестирования.
проверяет использование фреймворка после каждого метода тестирования.
Мне не ясно, имеет ли использование бегуна какое-либо преимущество перед initMocks() метод, который я использовал в прошлом.
любые мысли или ссылки будут оценены!
2 ответов:
MockitoJUnitRunnerдает вам автоматическую проверку использования фреймворка, а также автоматическийinitMocks().автоматическая проверка использования фреймворка на самом деле стоит иметь. Это дает вам лучше, если вы сделаете одну из этих ошибок.
вы вызываете статический!--4--> метод, но не завершайте stubbing с соответствующим
thenReturn,thenThrowилиthen. (Ошибка 1 в коде ниже)вы называете
verifyна макет, но забудьте предоставить вызов метода что вы пытаетесь проверить. (Ошибка 2 в коде ниже)вы называете
whenметод послеdoReturn,doThrowилиdoAnswerи передайте макет, но забудьте указать метод, который вы пытаетесь заглушить. (Ошибка 3 в коде ниже)если у вас нет подтверждения использование фреймворка, эти ошибки не сообщаются до после вызов метода Mockito. Это может быть
- в том же методе тестирования (например, Ошибка 1 ниже),
- в следующем методе тестирования (например, ошибка 2 ниже),
- в следующем тестовом классе.
если они происходят в последнем тесте, который вы запускаете (например, ошибка 3 ниже), они не будут сообщены вообще.
вот как каждый из этих типов ошибок может выглядеть. Предположим, что JUnit выполняет эти тесты в том порядке, в котором они перечислены здесь.
@Test public void test1() { // ERROR 1 // This compiles and runs, but it's an invalid use of the framework because // Mockito is still waiting to find out what it should do when myMethod is called. // But Mockito can't report it yet, because the call to thenReturn might // be yet to happen. when(myMock.method1()); doSomeTestingStuff(); // ERROR 1 is reported on the following line, even though it's not the line with // the error. verify(myMock).method2(); } @Test public void test2() { doSomeTestingStuff(); // ERROR 2 // This compiles and runs, but it's an invalid use of the framework because // Mockito doesn't know what method call to verify. But Mockito can't report // it yet, because the call to the method that's being verified might // be yet to happen. verify(myMock); } @Test public void test3() { // ERROR 2 is reported on the following line, even though it's not even in // the same test as the error. doReturn("Hello").when(myMock).method1(); // ERROR 3 // This compiles and runs, but it's an invalid use of the framework because // Mockito doesn't know what method call is being stubbed. But Mockito can't // report it yet, because the call to the method that's being stubbed might // be yet to happen. doReturn("World").when(myMock); doSomeTestingStuff(); // ERROR 3 is never reported, because there are no more Mockito calls. }теперь, когда я впервые написал этот ответ более пяти лет назад, я писал
поэтому я бы рекомендовал использовать
MockitoJUnitRunnerвезде, где это возможно. Однако, как правильно указал Томаш Нуркевич, вы не можете использовать его, если вам нужен другой бегун JUnit, такой как Spring.моя рекомендация изменилась. Команда Mockito добавили новую функцию, так как я впервые написал этот ответ. Это правило JUnit, которое выполняет точно такую же функцию, как и
MockitoJUnitRunner. Но это лучше, потому что это не исключает использования других бегунов.включить
@Rule public MockitoRule rule = MockitoJUnit.rule();в своем тестовом классе. Это инициализирует насмешки и автоматизирует проверку структуры; так же, как
MockitoJUnitRunnerделает. Но теперь, вы можете использоватьSpringJUnit4ClassRunnerили любой другой JUnitRunner, а также. Начиная с Mockito 2.1.0, есть дополнительные параметры, которые контролируют, какие именно проблемы будут сообщены.
использование runner позволяет сохранить немного кодирования (нет необходимости
@Beforeметод). С другой стороны, использование бегуна иногда невозможно, т. е. когда вы уже используете его, напримерSpringJUnit4ClassRunner.вот именно. Это просто вопрос предпочтения.
Comments