web-dev-qa-db-de.com

die Scheininstanz ist nach der @Mock-Anmerkung null

Ich versuche diesen Test durchzuführen:

    @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);

...
    }

aber ich bekomme NullPointerException für:

Mockito.when(routingClientMock.

was vermisse ich?

31
Elad Benda2

Wenn Sie die Annotation @Mock verwenden möchten, sollten Sie die MockitoJUnitRunner verwenden.

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

    @Mock
    private IRoutingObjHttpClient routingClientMock;

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

}

Siehe auch dieses Tutorial .

42

Sie haben drei Möglichkeiten, die Annotation @Mock zu aktivieren. IMHO ist die Variable MockitoRule die beste, weil Sie immer noch einen anderen Läufer wählen können, z. Parameterized.

Verwenden Sie die MockitoRule

public class MockitoTest {

  @Mock
  private IRoutingObjHttpClient routingClientMock;

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

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

Verwenden Sie den MockitoJUnitRunner

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

  @Mock
  private IRoutingObjHttpClient routingClientMock;

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

Rufen Sie MockitoAnnotations.initMocks (this) explizit auf. Dies kann in der qn @Before-Methode, in Ihrem eigenen Läufer oder in einer eigenen Regel erfolgen.

public class MockitoTest {

  @Mock
  private IRoutingObjHttpClient routingClientMock;

  @Before
  public void createMocks() {
    MockitoAnnotations.initMocks(this);
  }

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

Es kann auch ein Importproblem sein. Stellen Sie daher sicher, dass Sie das entsprechende importierte Paket haben.

Zum Beispiel hat das Paket "org.easymock" auch eine Annotation namens @Mock, die natürlich nicht mit Mockito-spezifischen Einstellungen funktioniert.

2
Z3d4s

Versuchen Sie zu prüfen, ob die von Ihnen aufgerufene Methode eine final -Methode ist oder nicht.

Mockito kann die endgültige Methode nicht verspotten. https://github.com/mockito/mockito/wiki/FAQ

1
UmAnusorn
  1. Sie sollten @RunWith(SpringJUnit4ClassRunner.class) in Ihrer Klasse verwenden
  2. Sie müssen MockitoAnnotations.initMocks(this); in der Methode @Before aufrufen
1
enoder

Wenn Sie junit.jupiter mit @ExtendWith(MockitoExtension.class) für die Testklasse verwenden, aber Mocks null sind, müssen Sie sicherstellen, dass die @Test-Anmerkung importiert wird

import org.junit.jupiter.api.Test;

anstelle von org.junit.Test;

0
Rammgarot

Dasselbe Problem kann auftreten, wenn Sie Junit5 verwenden, da keine Anmerkung '@RunWith' mehr vorhanden ist.

In diesem Fall sollten Sie Ihre Klasse mit folgenden Anmerkungen versehen:

@ExtendWith(MockitoExtension.class)
public class MyTestClass {
...

Sie sollten auch in Ihre Abhängigkeit importieren (Maven - pom.xml):

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>${mockito.version}</version>
    <scope>test</scope>
</dependency>
0
Gjera