137 votes

Différence entre l'utilisation de MockMvc avec SpringBootTest et l'utilisation de WebMvcTest

Je suis nouveau sur le Printemps de Démarrage et essaie de comprendre comment le test fonctionne dans SpringBoot. Je suis un peu confus au sujet de ce qu'est la différence entre les deux extraits de code:

Extrait de Code 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!")));
    }
}

Ce test utilise la @WebMvcTest annotation qui, je crois, est fonction de la tranche d'essai et ne teste que le Mvc couche d'une application web.

Extrait de Code 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!")));
    }
}

Ce test utilise la @SpringBootTest d'annotation et d'un MockMvc. Alors, comment est-ce différent de l'extrait de code 1? Qu'est-ce faire différemment?

Edit: L'ajout d'Extrait de Code 3 (Trouvé cela comme un exemple de test d'intégration dans le Ressort de la documentation)

@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!"));
}
}

124voto

Stephane Nicoll Points 18754

@SpringBootTest est le test général de l'annotation. Si vous êtes à la recherche de quelque chose qui fait la même chose avant la 1.4, c'est celui que vous devez utiliser. Il n'utilise pas de découpage à tous, ce qui signifie qu'il commencerez votre plein contexte de l'application et de ne pas personnaliser le composant de balayage.

@WebMvcTest ne va scanner le contrôleur que vous avez défini et le MVC de l'infrastructure. C'est tout. Donc, si votre contrôleur a une certaine dépendance à d'autres haricots de votre couche de service, le test ne démarre pas jusqu'à ce que vous charge de cette configuration vous-même ou de fournir une maquette. C'est beaucoup plus rapide, car nous ne charge qu'une petite portion de votre application. Cette annotation utilise le découpage.

La lecture de la doc devrait probablement vous aider.

97voto

RoshanKumar Mutha Points 669

@SpringBootTest annotation indique Printemps de Démarrage pour aller chercher une configuration principal de la classe (une avec @SpringBootApplication par exemple), et de l'utiliser pour démarrer un Printemps contexte de l'application. SpringBootTest des charges complet de l'application et l'injecte tous les fèves qui est peut être lent.

@WebMvcTest - pour tester le contrôleur de couche et vous devez fournir le reste des dépendances nécessaires en utilisant les Objets Fantaisie.

Quelques annotations ci-dessous pour votre référence.

Les tests de tranches de l'application Parfois, vous souhaitez tester un simple "tranche" de l'application au lieu de l'auto-configuration de l'ensemble de l'application. Printemps de Démarrage 1.4 introduit 4 nouveaux test annotations:

@WebMvcTest - for testing the controller layer
@JsonTest - for testing the JSON marshalling and unmarshalling
@DataJpaTest - for testing the repository layer
@RestClientTests - for testing REST clients

Reportez-vous pour plus d'informations : https://spring.io/guides/gs/testing-web/

18voto

John Frusciante Points 150

MVC tests sont destinés à couvrir juste le contrôleur morceau de votre application. Requêtes et réponses HTTP et on se moque de sorte que le réel les connexions ne sont pas créée. D'autre part, lorsque vous utilisez @SpringBootTest, tous les configuration pour le contexte d'application web est chargé et les connexions allez par le biais de la véritable serveur web. Dans ce cas, vous n'utilisez pas l' MockMvc bean, mais une norme RestTemplate à la place (ou la nouvelle alternative TestRestTemplate).

Donc, quand doit-on choisir l'un ou l'autre? @WebMvcTest est destiné à test unitarily le contrôleur à partir du côté serveur. @SpringBootTest, sur la d'autre part, devraient être utilisés pour les tests d'intégration, lorsque vous souhaitez interagir avec l'application côté client.

Cela ne signifie pas que vous ne pouvez pas utiliser les objets fantaisie avec @SpringBootTest; si vous êtes en train de rédiger un test d'intégration, qui pourrait encore être nécessaire. En tout cas, il est préférable de ne pas l'utiliser juste pour un simple contrôleur de l'appareil de test.

source d'Apprentissage Microservices avec Spring Boot

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X