Kurzanleitung zu @RestClientTest im Spring Boot

Kurzanleitung zu @RestClientTest in Spring Boot

1. Einführung

Dieser Artikel ist eine kurze Einführung in die Annotation von@RestClientTest.

Die neue Anmerkung vereinfacht und beschleunigt das Testen von REST-Clients in Ihren Spring-Anwendungen.

2. REST-Client-Unterstützung in Spring Boot Pre-1.4

Spring Boot ist ein praktisches Framework, das viele automatisch konfigurierte Spring Beans mit typischen Einstellungen bereitstellt, mit denen Sie sich weniger auf die Konfiguration einer Spring-Anwendung als vielmehr auf Ihren Code und Ihre Geschäftslogik konzentrieren können.

In Version 1.3 erhalten wir jedoch nicht viel Hilfe, wenn wir REST-Service-Clients erstellen oder testen möchten. Die Unterstützung für REST-Kunden ist nicht sehr tief.

Zum Erstellen eines Clients für eine REST-API wird normalerweise eineRestTemplate-Instanz verwendet. Normalerweise muss es vor der Verwendung konfiguriert werden und seine Konfiguration kann variieren, sodass Spring Boot keine universell konfigurierteRestTemplate-Bean bereitstellt.

Gleiches gilt für das Testen von REST-Clients. Vor Spring Boot 1.4.0 war das Verfahren zum Testen eines Spring-REST-Clients nicht wesentlich anders als in anderen Spring-basierten Anwendungen. Sie würden eineMockRestServiceServer-Instanz erstellen, sie an die zu testendeRestTemplate-Instanz binden und sie mit Scheinantworten auf Anforderungen wie diese versehen:

RestTemplate restTemplate = new RestTemplate();

MockRestServiceServer mockServer =
  MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/greeting"))
  .andRespond(withSuccess());

// Test code that uses the above RestTemplate ...

mockServer.verify();

Sie müssten auch den Spring-Container initialisieren und sicherstellen, dass nur die erforderlichen Komponenten in den Kontext geladen werden, um die Ladezeit des Kontexts (und folglich die Testausführungszeit) zu beschleunigen.

3. Neue REST-Client-Funktionen in Spring Boot 1.4+

In Spring Boot 1.4 hat das Team große Anstrengungen unternommen, um die Erstellung und das Testen von REST-Clients zu vereinfachen und zu beschleunigen.

Schauen wir uns also die neuen Funktionen an.

3.1. Hinzufügen von Spring Boot zu Ihrem Projekt

Zunächst müssen Sie sicherstellen, dass Ihr Projekt Spring Boot 1.4.x oder höher verwendet:


    org.springframework.boot
    spring-boot-starter-parent
     

    
        org.springframework.boot
        spring-boot-starter-web
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    

Neueste Release-Versionen finden Sie inhere.

3.2. RestTemplateBuilder

Spring Boot enthält sowohl die automatisch konfiguriertenRestTemplateBuilder, um das Erstellen vonRestTemplates zu vereinfachen, als auch die übereinstimmende@RestClientTest-Annotation, um die mitRestTemplateBuilder erstellten Clients zu testen. So können Sie einen einfachen REST-Client erstellen, bei demRestTemplateBuilderautomatisch für Sie injiziert wird:

@Service
public class DetailsServiceClient {

    private final RestTemplate restTemplate;

    public DetailsServiceClient(RestTemplateBuilder restTemplateBuilder) {
        restTemplate = restTemplateBuilder.build();
    }

    public Details getUserDetails(String name) {
        return restTemplate.getForObject("/{name}/details",
          Details.class, name);
    }
}

Beachten Sie, dass wir die Instanz vonRestTemplateBuildernicht explizit mit einem Konstruktor verbunden haben. Dies ist möglich dank einer neuen Spring-Funktion namens implizite Konstruktorinjektion, die inthis article erläutert wird.

RestTemplateBuilder bietet praktische Methoden zum Registrieren von Nachrichtenkonvertern, Fehlerbehandlungsroutinen, URI-Vorlagenhandlern und zur grundlegenden Autorisierung sowie zur Verwendung zusätzlicher Anpassungsprogramme, die Sie benötigen.

3.3. @RestClientTest

Zum Testen eines solchen REST-Clients, der mitRestTemplateBuilder erstellt wurde, können Sie eine vonSpringRunner ausgeführte Testklasse verwenden, die mit@RestClientTest versehen ist. Diese Anmerkung deaktiviert die vollständige automatische Konfiguration und wendet nur die Konfiguration an, die für REST-Client-Tests relevant ist, d. H. Automatische Konfiguration von Jackson oder GSON und@JsonComponent Beans, jedoch keine regulären@Component Beans.

@RestClientTest stellt sicher, dass die Jackson- und GSON-Unterstützung automatisch konfiguriert wird, und fügt dem Kontext vorkonfigurierte Instanzen vonRestTemplateBuilder undMockRestServiceServerhinzu. Die zu testende Bean wird mit dem Attributvalue odercomponents der Annotation@RestClientTest angegeben:

@RunWith(SpringRunner.class)
@RestClientTest(DetailsServiceClient.class)
public class DetailsServiceClientTest {

    @Autowired
    private DetailsServiceClient client;

    @Autowired
    private MockRestServiceServer server;

    @Autowired
    private ObjectMapper objectMapper;

    @Before
    public void setUp() throws Exception {
        String detailsString =
          objectMapper.writeValueAsString(new Details("John Smith", "john"));

        this.server.expect(requestTo("/john/details"))
          .andRespond(withSuccess(detailsString, MediaType.APPLICATION_JSON));
    }

    @Test
    public void whenCallingGetUserDetails_thenClientMakesCorrectCall()
      throws Exception {

        Details details = this.client.getUserDetails("john");

        assertThat(details.getLogin()).isEqualTo("john");
        assertThat(details.getName()).isEqualTo("John Smith");
    }
}

Zunächst müssen wir sicherstellen, dass dieser Test mitSpringRunner ausgeführt wird, indem wir die Annotation@RunWith(SpringRunner.class) hinzufügen.

Was gibt's Neues?

First - Mit der Annotation@RestClientTest können wir den genauen zu testenden Service angeben - in unserem Fall handelt es sich um die KlasseDetailsServiceClient. Dieser Dienst wird in den Testkontext geladen, während alles andere herausgefiltert wird.

Dies ermöglicht es uns, dieDetailsServiceClient-Instanz innerhalb unseres Tests automatisch zu verdrahten und alles andere draußen zu lassen, was das Laden des Kontexts beschleunigt.

Second - Da die Instanz vonMockRestServiceServerauch für einen mit@RestClientTest annotierten Test konfiguriert ist (und für uns an die Instanz vonDetailsServiceClientgebunden ist), können wir sie einfach injizieren und verwenden.

Finally - Mit der JSON-Unterstützung für@RestClientTest können wir dieObjectMapper-Instanz von Jackson injizieren, um den Scheinantwortwert vonMockRestServiceServer’svorzubereiten.

Sie müssen lediglich den Anruf bei unserem Service ausführen und die Ergebnisse überprüfen.

4. Fazit

In diesem Artikel haben wir die neue Annotation@RestClientTesterläutert, mit der REST-Clients, die mit Spring erstellt wurden, einfach und schnell getestet werden können.

Der Quellcode für den Artikel iston GitHub verfügbar.