web-dev-qa-db-fra.com

l'instance fictive est nulle après l'annotation @Mock

J'essaye de lancer ce test:

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

...
    }

mais j'obtiens NullPointerException pour:

Mockito.when(routingClientMock.

qu'est-ce que je rate?

31
Elad Benda2

Lorsque vous souhaitez utiliser l'annotation @Mock, vous devez utiliser la variable MockitoJUnitRunner

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

    @Mock
    private IRoutingObjHttpClient routingClientMock;

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

}

Voir aussi ce tutoriel .

42
Roland Weisleder

Vous avez trois options pour activer l'annotation @Mock. IMHO en utilisant MockitoRule est le meilleur, car il vous permet de choisir un autre coureur comme par exemple. Parameterized.

Utilisez le MockitoRule

public class MockitoTest {

  @Mock
  private IRoutingObjHttpClient routingClientMock;

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

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

Utilisez le MockitoJUnitRunner

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

  @Mock
  private IRoutingObjHttpClient routingClientMock;

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

Appelez MockitoAnnotations.initMocks (this) explicitement. Cela peut être fait dans la méthode qn @Before, dans votre propre coureur ou dans une propre règle.

public class MockitoTest {

  @Mock
  private IRoutingObjHttpClient routingClientMock;

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

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

Il peut également s'agir d'un problème d'importation, alors assurez-vous de disposer du package importé approprié.

Par exemple, le package "org.easymock" comporte également une annotation appelée @Mock, qui ne fonctionnera bien entendu pas avec la configuration spécifique à Mockito.

2
Z3d4s

Essayez de vérifier si la méthode que vous appelez est une méthode final ou non.

Mockito ne peut pas se moquer de la méthode finale. https://github.com/mockito/mockito/wiki/FAQ

1
UmAnusorn
  1. Vous devriez utiliser @RunWith(SpringJUnit4ClassRunner.class) dans votre classe
  2. Vous devez appeler MockitoAnnotations.initMocks(this); dans la méthode @Before
1
enoder

Si vous utilisez junit.jupiter avec @ExtendWith(MockitoExtension.class) pour la classe de test mais les mock sont null , assurez-vous que l'annotation @Test est importée

import org.junit.jupiter.api.Test;

au lieu de org.junit.Test;

0
Rammgarot