Ich habe einen Spring Web-Server, der auf eine Anfrage einen externen Aufruf an einige Web-API von Drittanbietern (z. B. retreive Facebook oauth Token). Nach dem Abrufen von Daten aus nennt dies berechnet sie eine Antwort:Mock externen Server während der Integration Tests mit 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;
}
}
ich einen Integrationstest zu schreiben, dass url prüft schlagen auf meinem Server zu einem gewissen erwarteten Ergebnis führt. Ich möchte jedoch den externen Server vortäuschen, so dass ich nicht einmal einen Internetzugang benötige, um das alles zu testen. Was ist der beste Weg, dies zu tun?
Ich bin ein Neuling im Frühjahr, das ist was ich bisher habe.
@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();
}
}
Die tatsächliche reale aufgebaut ist komplizierter - Ich mache Login Facebook oauth und alles, was Logik ist in der Steuerung nicht aber in verschiedenen Objekten Spring Security. Ich vermute jedoch, dass der Testcode derselbe sein sollte, da ich nur URLs triff und eine Antwort erwarte, oder?
Ich kam mit diesem Code, um zu verstehen, wie man einen komplizierteren Integrationstest schreibt. Das eigentliche System, das ich testen und dann umgestalten möchte, besteht aus mehreren Spring-Sicherheitsmodulen, die zusammenarbeiten, um oauth2 mit facebook bereitzustellen. All dies geschieht mit gesicherter zustandsloser REST-Architektur, die eigene Macken hat. Letztendlich möchte ich dieses komplexe System testen - es gibt mehrere Schritte vor Facebook-Aufruf und einige danach. Diese Controller-Frage ist der einfachste, klare erste Schritt, den ich mir jetzt vorstellen kann, und wenn ich das ganze System posten werde, ist es völlig unmöglich zu antworten. – otognan
Ist es fair zu sagen, dass Sie das Verhalten Ihrer App teilweise testen möchten, wenn die Spring Security Authentifizierungsfehler aufweist? –
Ich habe schon einen funktionierenden Prototyp, aber es ist hässlich. Ich habe keinen Druck auf dieses Projekt - also möchte ich ein paar Tests schreiben, die sicherstellen, dass das System gut funktioniert, während ich ein großes Refactoring machen werde. Also ja, teilweise möchte ich Testauthentifizierungsverweigerungen und andere Fehlermodi, aber hauptsächlich möchte ich sicher sein, dass ich die funktionierende Funktionalität beim Refactoring bewahre. – otognan