Unterschied zwischen der Verwendung MockMvc mit SpringBootTest und Mit WebMvcTest
Ich bin neu in Spring Boot und versuche zu verstehen, wie testing arbeitet in SpringBoot. Ich bin ein bisschen verwirrt darüber, was ist der Unterschied zwischen folgenden zwei code-snippets:
Code-snippet 1:
@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerApplicationTest {
@Autowired
private MockMvc mvc;
@Test
public void getHello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().string(equalTo("Greetings from Spring Boot!")));
}
}
Dieser test verwendet die @WebMvcTest Anmerkung, die ich glaube, ist für feature-Scheibe-Tests und tests der Mvc-Schicht der Webanwendung.
Code-snippet 2:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void getHello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().string(equalTo("Greetings from Spring Boot!")));
}
}
Dieser test verwendet die @SpringBootTest Kommentare und MockMvc. Also wie unterscheidet sich dies von code-snippet 1? Was macht diese anders machen?
Bearbeiten:
Hinzufügen von Code-Snippet 3 (Fand dies als ein Beispiel von integration-Tests in der Spring-Dokumentation)
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloControllerIT {
@LocalServerPort
private int port;
private URL base;
@Autowired
private TestRestTemplate template;
@Before
public void setUp() throws Exception {
this.base = new URL("http://localhost:" + port + "/");
}
@Test
public void getHello() throws Exception {
ResponseEntity<String> response = template.getForEntity(base.toString(),
String.class);
assertThat(response.getBody(), equalTo("Greetings from Spring Boot!"));
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
@SpringBootTest
ist der Allgemeine test-annotation. Wenn Sie auf der Suche nach etwas, das nicht die gleiche Sache vor 1.4, das ist die, die Sie verwenden sollten. Es nicht schneiden, was bedeutet, dass Sie beginnen, Ihre Bewerbung Kontext und nicht anpassen-Komponente Scannen überhaupt.@WebMvcTest
ist nur noch zu Scannen Sie den controller, den Sie definiert haben und das MVC-Infrastruktur. Das ist es. Also, wenn Ihr controller hat einige Abhängigkeiten zu anderen beans von Ihrem service-Schicht, die Prüfung nicht zu starten, bis Sie entweder laden, die config selbst oder ein Modell für Sie. Dies ist viel schneller als wir nur laden, einen kleinen Teil Ihrer app. Diese annotation verwendet slicing.Das Lesen der doc sollte wahrscheinlich helfen Sie auch.
SpringBootTest
laden Ihre volle app (zu einigen erweitern, standardmäßig wird es nicht starten Sie den embedded container, wenn es einem zur Verfügung steht, das ist, was diewebEnvironment
gibt es für). Ich würde nicht sagen, dass@SpringBootTest
ist ein unit-test der Steuerung, sondern eher um eine integration-test, wirklich.WebMvcTest
ist wirklich ein unit test für den controller in dem Sinne, dass, wenn es Abhängigkeit, werden Sie haben, um Sie selbst (entweder config oder ein mock von einer Art).SpringBootTest
undWebMvcTest
erstellen sind sehr unterschiedlich. Der ehemalige lädt Ihre GANZE app und ermöglicht ALLEN auto-Konfigurationen, während die letztere erst ermöglicht, Spring Mvc und scannt nicht alles, aberHelloController
. Es hängt alles davon ab, was Sie bedeuten, durch einen unit-test, nachdem alle. Aber das ist der Unterschied.@SpringBootTest Anmerkung sagt, Spring Boot zu gehen und suchen Sie die Haupt-configuration-Klasse (mit @SpringBootApplication zum Beispiel), und verwenden Sie diese zum starten eines Spring application context. SpringBootTest lädt komplette Anwendung und spritzt alle Bohnen, die langsam sein kann.
@WebMvcTest - für das testen der controller-Schicht und müssen Sie die restlichen Abhängigkeiten erforderlich, mit Mock-Objekten.
Paar weitere Anmerkungen unten für Ihre Referenz.
Scheiben testen der Anwendung
Manchmal möchten Sie zum testen ein einfaches "Scheibe" von der Anwendung statt auto-Konfiguration der gesamten Anwendung. Spring Boot 1.4 stellt 4 neue test Anmerkungen:
Finden Sie weitere Informationen : https://spring.io/guides/gs/testing-web/
MVC-tests decken nur den controller-Teil der Anwendung.
HTTP-Anfragen und-Antworten verspottet so die wirklichen verbindungen sind nicht
erstellt. Auf der anderen Seite, wenn Sie die Verwendung von @SpringBootTest, alle
Konfiguration der web-Anwendung Kontext geladen, und die verbindungen
durch die den echten web-server. In diesem Fall, Sie don nicht verwenden
MockMvc Bohne, sondern ein standard-RestTemplate statt (oder die neue alternative
TestRestTemplate).
So, Wann sollten wir das eine oder andere entscheiden? @WebMvcTest soll
test unitarily der controller von der server-Seite. @SpringBootTest, auf die
andererseits sollte verwendet werden, für die integration-tests, wenn Sie wollen, zu interagieren
mit der Anwendung von der client-Seite.
Das bedeutet nicht, dass Sie nicht verwenden können, verhöhnt mit @SpringBootTest; wenn
Sie schreiben ein integration-test, das könnte noch nötig sein. In jedem Fall
es ist besser, nicht zu verwenden Sie es nur für einen einfachen controller unit-test.
source - Learning-Microservices mit Spring Boot