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() {
}
}
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"));
}
}
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.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.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
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() {
}
}
Das Hinzufügen der Annotation @WebAppConfiguration
(org.springframework.test.context.web.WebAppConfiguration
) Zu Ihrer DemoApplicationTests-Klasse funktioniert.