Подтвердить что ты не робот

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.

что мне не хватает?

4b9b3361

Ответ 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.

Используйте MockitoRule

public class MockitoTest {

  @Mock
  private IRoutingObjHttpClient routingClientMock;

  @Rule
  public MockitoRule rule = MockitoJUnit.rule();

  @Test
  public void testSendRoutingRequest() throws Exception {
    // ...
  }
}

Используйте MockitoJUnitRunner

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

  @Mock
  private IRoutingObjHttpClient routingClientMock;

  @Test
  public void testSendRoutingRequest() throws Exception {
    // ...
  }
}

Вызовите MockitoAnnotations.initMocks(this) в явном виде.

Это можно сделать с помощью метода 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.