web-dev-qa-db-ja.com

@Mockアノテーションの後、モックインスタンスはnullです

私はこのテストを実行しようとします:

    @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.

私は何が欠けていますか?

46
Elad Benda2

@Mockアノテーションを使用する場合は、MockitoJUnitRunnerを使用する必要があります

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

    @Mock
    private IRoutingObjHttpClient routingClientMock;

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

}

このチュートリアル も参照してください。

56

@Mock注釈をアクティブにするための3つのオプションがあります。 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 {
    // ...
  }
}
43
Stefan Birkner
  1. クラスで@RunWith(SpringJUnit4ClassRunner.class)を使用する必要があります
  2. @BeforeメソッドでMockitoAnnotations.initMocks(this);を呼び出す必要があります
2
enoder

また、インポートの問題になる可能性があるため、適切なインポート済みパッケージがあることを確認してください。

たとえば、「org.easymock」パッケージには@Mockという注釈もありますが、これはもちろんMockito固有のセットアップでは機能しません。

2
Z3d4s

呼び出しているメソッドがfinalメソッドかどうかを確認してください。

Mockitoは最終メソッドをモックできません。 https://github.com/mockito/mockito/wiki/FAQ

1
UmAnusorn

テストクラスで_junit.jupiter_を@ExtendWith(MockitoExtension.class)とともに使用するが、モックがnullの場合、_@Test_アノテーションがインポートされることを確認します

_import org.junit.jupiter.api.Test;
_

_org.junit.Test;_の代わりに

0
Rammgarot

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>
0
Gjera