web-dev-qa-db-fra.com

Se moquer d'un REST appel avec MockRestServiceServer

J'essaie d'écrire un cas de test JUnit qui teste une méthode dans une classe d'assistance. La méthode appelle une application externe en utilisant REST et c'est cet appel que j'essaie de simuler dans le test JUnit.

La méthode d'assistance effectue l'appel REST à l'aide du RestTemplate de Spring.

Dans mon test, je crée un modèle REST serveur et modèle REST modèle et les instancie comme ceci:

@Before
public void setUp() throws Exception {
    mockServer = MockRestServiceServer.createServer(helperClass.getRestTemplate());
}

J'amorce ensuite le faux serveur afin qu'il retourne une réponse appropriée lorsque la méthode d'assistance effectue l'appel REST:

// response is some XML in a String
mockServer
    .expect(MockRestRequestMatchers.requestTo(new URI(myURL)))
    .andExpect(MockRestRequestMatchers.method(HttpMethod.GET))
    .andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK)
        .contentType(MediaType.APPLICATION_XML)
        .body(response));

Lorsque j'exécute mon test, la méthode d'assistance reçoit une réponse nulle de l'appel REST qu'elle effectue et le test échoue.

L'URL REST que l'assistant crée a des paramètres de requête et ressemble à ceci: " http: // serveur: port/application/ressource? Queryparam1 = valeur1 & queryparam2 = valeur2 " .

J'ai essayé de mettre l'URL (" http: // serveur: port/application/ressource ") à la fois avec et sans les paramètres de requête dans la variable "myURL" (pour obtenir une correspondance afin qu'elle renvoie une réponse), mais ne peut pas obtenir du serveur simulé de renvoyer quoi que ce soit.

J'ai essayé de rechercher des exemples de ce type de code, mais je n'ai pas encore trouvé quoi que ce soit qui semble ressembler à mon scénario.

Version Spring 4.1.7.

Merci d'avance pour toute aide.

9
GarlicBread

Lorsque vous créez une instance de MockRestServiceServer, vous devez utiliser l'instance existante de RestTemplate qui est utilisée par votre code de production. Essayez donc d'injecter RestTemplate dans votre test et utilisez-le lorsque vous appelez MockRestServiceServer.createServer - ne créez pas de nouveau RestTemplate dans vos tests.

11
Rafal G.

Semble que vous essayez de tester le reste du client, le reste du serveur doit être testé ailleurs. Vous utilisez RestTemplate -> Pour appeler le service. Ensuite, j'ai essayé de se moquer de RestTemplate et des résultats de son appel.

@Mock
RestTemplate restTemplateMock;

et classe de service sous test

@InjectMocks
Service service;

Disons que le service a une méthode à tester

public void filterData() {
   MyResponseModel response = restTemplate.getForObject(serviceURL, MyResponseModel.class);
   // further processing with response
}

Ensuite, pour tester la méthode filterData, vous devez simuler la réponse de l'appel restTemplate tel que

mockResponseModel = createMockResponse();
Mockito.when(restTemplateMock.getForObject(serviceURL, MyResponseModel.class)).thenReturn(mockResponseModel);

service.filterData();
//Other assert/verify,... go here
4
VinhNT

Vous pouvez créer une nouvelle instance de RestTemplate mais vous devez la passer dans votre méthode createServer comme ceci:

private RestTemplate restTemplate = new RestTemplate();
@BeforeEach
public void setUp() {
MockitoAnnotations.initMocks(this);
mockServer = MockRestServiceServer.createServer(restTemplate);
client.setRestTemplate(restTemplate);
}
0
Jared