Mock instance имеет значение null после аннотации @Mock
Я пытаюсь запустить этот тест:
@Mock IRoutingObjHttpClient routingClientMock;
@Mock IRoutingResponseRepository routingResponseRepositoryMock;
@Test
public void testSendRoutingRequest() throws Exception {
CompleteRoutingResponse completeRoutingResponse = new CompleteRoutingResponse();
completeRoutingResponse.regression_latencyMillis = 500L;
Mockito.when(routingClientMock.sendRoutingRequest(any(RoutingRequest.class))).thenReturn(completeRoutingResponse);
RoutingObjHttpClientWithReRun routingObjHttpClientWithReRun = new RoutingObjHttpClientWithReRun
(routingClientMock, routingResponseRepositoryMock);
...
}
но я получаю исключение NullPointerException для:
Mockito.when(routingClientMock.
что мне не хватает?
Ответы
Ответ 1
Если вы хотите использовать аннотацию @Mock
, вы должны использовать MockitoJUnitRunner
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
@Mock
private IRoutingObjHttpClient routingClientMock;
@Test
public void testSendRoutingRequest() throws Exception {
// ...
}
}
См. также этот учебник.
Ответ 2
У вас есть три варианта активации аннотации @Mock
: MockitoRule, MockitoJUnitRunner, MockitoAnnotations.initMocks(this). ИМХО использование MockitoRule
является лучшим, потому что оно позволяет вам выбрать другого бегуна, например, например. Parameterized
.
public class MockitoTest {
@Mock
private IRoutingObjHttpClient routingClientMock;
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Test
public void testSendRoutingRequest() throws Exception {
// ...
}
}
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
@Mock
private IRoutingObjHttpClient routingClientMock;
@Test
public void testSendRoutingRequest() throws Exception {
// ...
}
}
Это можно сделать с помощью метода qn @Before
, вашего собственного бегуна или собственного правила.
public class MockitoTest {
@Mock
private IRoutingObjHttpClient routingClientMock;
@Before
public void createMocks() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testSendRoutingRequest() throws Exception {
// ...
}
}
Ответ 3
Это также может быть проблемой импорта, поэтому убедитесь, что у вас есть соответствующий импортированный пакет.
Например, пакет "org.easymock" также имеет аннотацию, называемую @Mock, что, конечно же, не будет работать с конкретной установкой Mockito.
Ответ 4
- Вы должны использовать
@RunWith(SpringJUnit4ClassRunner.class)
в своем классе
- Вы должны вызвать
MockitoAnnotations.initMocks(this);
в методе @Before
Ответ 5
Попробуйте проверить, является ли вызываемый вами метод окончательным или нет.
Мокито не может издеваться над последним методом. https://github.com/mockito/mockito/wiki/FAQ
Ответ 6
Та же проблема может возникнуть, если вы используете Junit5, так как больше нет аннотации @RunWith.
В этом случае вы должны аннотировать ваш класс:
@ExtendWith(MockitoExtension.class)
public class MyTestClass {
...
Вы также должны импортировать в свою зависимость (Maven - pom.xml):
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
Ответ 7
Если вы используете junit.jupiter
с @ExtendWith(MockitoExtension.class)
для тестового класса, но макеты имеют нулевое значение, убедитесь, что аннотация @Test
импортирована из
import org.junit.jupiter.api.Test;
вместо org.junit.Test;
Ответ 8
Если вы также используете PowerMock, то
@RunWith(MockitoJUnitRunner.class)
можно заменить на
@RunWith(PowerMockRunner.class)
Это активирует ваш @Mocks
и включит функциональность PowerMock.