Possiedo un server Web Spring che in una richiesta effettua una chiamata esterna a un'API Web di terze parti (ad esempio, richiede token Facebook oauth). Dopo aver ottenuto i dati dal presente invito si calcola una risposta:Mock server esterno durante i test di integrazione con Spring
@RestController
public class HelloController {
@RequestMapping("/hello_to_facebook")
public String hello_to_facebook() {
// Ask facebook about something
HttpGet httpget = new HttpGet(buildURI("https", "graph.facebook.com", "/oauth/access_token"));
String response = httpClient.execute(httpget).getEntity().toString();
// .. Do something with a response
return response;
}
}
sto scrivendo un test di integrazione che controlla che colpisce url sul mio server porta a qualche risultato atteso. Tuttavia, voglio prendere in giro il server esterno in locale in modo che non abbia nemmeno bisogno dell'accesso a Internet per testare tutto questo. Qual è il modo migliore per farlo?
Sono un novizio in primavera, questo è quello che ho finora.
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest({})
public class TestHelloControllerIT {
@Test
public void getHelloToFacebook() throws Exception {
String url = new URL("http://localhost:8080/hello_to_facebook").toString();
//Somehow setup facebook server mock ...
//FaceBookServerMock facebookMock = ...
RestTemplate template = new TestRestTemplate();
ResponseEntity<String> response = template.getForEntity(url, String.class);
assertThat(response.getBody(), equalTo("..."));
//Assert that facebook mock got called
//facebookMock.verify();
}
}
Il vero effettivo allestimento è più complicato - Sto facendo Facebook OAuth login e tutto ciò che la logica non è nel controller, ma in vari oggetti Primavera di sicurezza. Tuttavia, sospetto che il codice di test debba essere lo stesso poiché sto solo scrivendo url e aspetto una risposta, non è vero?
Sono arrivato con questo codice per capire come scrivere un test di integrazione più complicato. Il sistema attuale che voglio testare e poi refactoring è composto da diversi moduli di sicurezza Spring che funzionano in accordo per fornire oauth2 con facebook. Tutto ciò che viene fatto con un'architettura REST stateless protetta che ha le sue peculiarità. In definitiva voglio testare questo complesso sistema - ci sono diversi passaggi prima di chiamare Facebook e diversi dopo. Questa domanda del controller è il primo passo più semplice e chiaro a cui riesco a pensare e postare l'intero sistema renderà totalmente impossibile rispondere. – otognan
È corretto dire che in parte vuoi testare il comportamento della tua app quando la sicurezza di primavera ha errori di autenticazione? –
Ho già un prototipo funzionante ma è brutto. Non ho alcuna pressione su questo progetto, quindi quello che voglio fare è scrivere alcuni test che garantiscano il buon funzionamento del sistema mentre eseguirò un grande refactoring. Quindi sì, in parte voglio negare l'autenticazione dei test e altre modalità di errore, ma soprattutto voglio essere sicuro di conservare la funzionalità di lavoro durante il refactoring. – otognan