wake-up-neo.net

So schreiben Sie einen Komponententest für einen Spring Boot Controller-Endpunkt

Ich habe ein Beispiel für eine Spring Boot-App mit folgendem Inhalt

Booten Sie die Hauptklasse

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

Regler

@RestController
@EnableAutoConfiguration
public class HelloWorld {
    @RequestMapping("/")
    String gethelloWorld() {
        return "Hello World!";
    }

}

Was ist der einfachste Weg, einen Komponententest für den Controller zu schreiben? Ich habe Folgendes versucht, aber es beklagt sich, dass das automatische Verdrahten von WebApplicationContext fehlgeschlagen ist

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DemoApplication.class)
public class DemoApplicationTests {

    final String BASE_URL = "http://localhost:8080/";

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @Test
    public void testSayHelloWorld() throws Exception{

         this.mockMvc.perform(get("/")
                 .accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
                 .andExpect(status().isOk())
                 .andExpect(content().contentType("application/json"));
    }

    @Test
    public void contextLoads() {
    }

}
64
user6123723

Spring MVC bietet ein StandaloneSetup an, mit dem relativ einfache Controller ohne Kontext getestet werden können.

Erstellen Sie eine MockMvc, indem Sie eine oder mehrere Instanzen von @ Controller registrieren und die Spring MVC-Infrastruktur programmgesteuert konfigurieren. Dies ermöglicht die vollständige Kontrolle über die Instanziierung und Initialisierung von Controllern und deren Abhängigkeiten, ähnlich wie bei einfachen Komponententests, und ermöglicht es gleichzeitig, jeweils einen Controller zu testen.

Ein Beispieltest für Ihre Steuerung kann so einfach sein wie

public class DemoApplicationTests {

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = standaloneSetup(new HelloWorld()).build();
    }

    @Test
    public void testSayHelloWorld() throws Exception {
        this.mockMvc.perform(get("/")
           .accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
           .andExpect(status().isOk())
           .andExpect(content().contentType("application/json"));

    }
}
45
Master Slave

Die neuen Testverbesserungen, die in Spring Boot 1.4.M2 kann helfen, die Menge an Code zu reduzieren, die Sie zum Schreiben einer solchen Situation benötigen.

Der Test würde so aussehen:

import static org.springframework.test.web.servlet.request.MockMvcRequestB‌​uilders.get; 
import static org.springframework.test.web.servlet.result.MockMvcResultMat‌​chers.content; 
import static org.springframework.test.web.servlet.result.MockMvcResultMat‌​chers.status;

    @RunWith(SpringRunner.class)
    @WebMvcTest(HelloWorld.class)
    public class UserVehicleControllerTests {

        @Autowired
        private MockMvc mockMvc;

        @Test
        public void testSayHelloWorld() throws Exception {
            this.mockMvc.perform(get("/").accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
                    .andExpect(status().isOk())
                    .andExpect(content().contentType("application/json"));

        }

    }

Siehe this Blogpost für weitere Details sowie documentation

28
geoand

Hier ist eine weitere Antwort, die das Standalone-Setup von Spring MVC verwendet. Auf diese Weise können Sie entweder die Controller-Klasse automatisch verkabeln oder sie verspotten.

    import static org.mockito.Mockito.mock;
    import static org.springframework.test.web.server.request.MockMvcRequestBuilders.get;
    import static org.springframework.test.web.server.result.MockMvcResultMatchers.content;
    import static org.springframework.test.web.server.result.MockMvcResultMatchers.status;

    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.http.MediaType;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.test.web.server.MockMvc;
    import org.springframework.test.web.server.setup.MockMvcBuilders;


    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    public class DemoApplicationTests {

        final String BASE_URL = "http://localhost:8080/";

        @Autowired
        private HelloWorld controllerToTest;

        private MockMvc mockMvc;

        @Before
        public void setup() {
            this.mockMvc = MockMvcBuilders.standaloneSetup(controllerToTest).build();
        }

        @Test
        public void testSayHelloWorld() throws Exception{
            //Mocking Controller
            controllerToTest = mock(HelloWorld.class);

             this.mockMvc.perform(get("/")
                     .accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
                     .andExpect(status().isOk())
                     .andExpect(content().mimeType(MediaType.APPLICATION_JSON));
        }

        @Test
        public void contextLoads() {
        }

    }
6
Siva Kumar

Das Hinzufügen der Annotation @WebAppConfiguration (org.springframework.test.context.web.WebAppConfiguration) Zu Ihrer DemoApplicationTests-Klasse funktioniert.

4
Charles Wang