[JAVA] Testez le contrôleur avec Mock MVC dans Spring Boot

Testez le contrôleur créé par Spring MVC à partir de JUnit à l'aide de Mock MVC.

Qu'est-ce que MockMVC

Vous pouvez reproduire le comportement de Spring MVC sans le déployer sur le serveur d'applications. MockMVC facilite la création de tests pour votre contrôleur. Pour utiliser MockMVC avec Spring Boot, ajoutez la description suivante à build.gradle.

build.gradle


testCompile('org.springframework.boot:spring-boot-starter-test')

Lorsque vous créez un projet avec SPRING INITIALIZR https://start.spring.io/, il est décrit par défaut dans build.gradle.

environnement

Pour essayer MockMVC cette fois, j'ai créé un projet chez SPRING INITIALIZR https://start.spring.io/. Les paramètres du projet sont les suivants. Puisque Spring MVC et Thymeleaf sont utilisés, veuillez sélectionner comme vous le souhaitez, sauf pour ajouter Web et Thymeleaf à la dépendance.

--Version de démarrage de printemps: 2.0M7 --Outil de construction: Gradle --Langue: Kotlin

Dans cet environnement, créez une page avec deux zones de texte et un bouton d'inscription pour saisir le nom d'utilisateur et l'adresse e-mail comme indiqué ci-dessous.

スクリーンショット 2017-12-28 17.43.49.png

Testez avec MockMVC que la page d'entrée s'affiche lors de l'accès à l'URL racine à partir d'un navigateur. Le but étant d'essayer MockMVC, le traitement autre que l'affichage de page est omis.

Créer un contrôleur

Créez un contrôleur qui affiche index.html pour les requêtes GET à l'URL racine.

UserController.kt


@Controller
class UserController {

    @RequestMapping(value = "/", method = [(RequestMethod.GET)])
    fun index(model: Model): String {
        model.addAttribute("userForm", UserForm())
        return "index"
    }
}    

Créer une classe de formulaire

Créez une classe pour le formulaire de saisie. Kotlin vous permet d'utiliser la classe de données, donc c'est simple à écrire.

UserForm.kt


data class UserForm(val name: String = "", val mail: String = "")

Créer une vue

Ajout de ce qui suit à build.gradle pour utiliser BootStrap.

build.gradle


compile group: 'org.webjars', name: 'bootstrap', version: '3.3.7-1'

Créez une page avec des zones de texte et des boutons dans Thymeleaf comme indiqué ci-dessous.

index.html


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <link rel="stylesheet" th:href="@{/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css}" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Enregistrement de l'utilisateur</title>
</head>
<body>
    <div class="container">
        <h1>Enregistrement de l'utilisateur</h1>
        <form id="userForm" method="post" th:action="@{/user}" th:object="${userForm}" action="/user">
            <div class="form-group">
                <label for="name">Name</label>
                <input class="form-control" id="name" type="text" th:feild="*{name}" name="name" placeholder="Name"/>
            </div>
            <div class="form-group">
                <label for="mail">Mail</label>
                <input class="form-control" id="mail" type="text" th:feild="*{mail}" name="mail" placeholder="Mail"/>
            </div>
            <button type="submit" class="btn btn-primary">enregistrement</button>
        </form>
    </div>
</body>
</html>

Créer un test

Envoyez une requête GET à l'URL racine et testez les éléments suivants dans la réponse obtenue. --Index.html s'affiche sous forme de vue

Créez une classe de test comme suit.

UserControllerTest.kt


@RunWith(SpringRunner::class) // ①
@WebMvcTest // ②
class UserControllerTest {

    @Autowired
    private lateinit var mockMvc: MockMvc  // ③

    @Test
    fun test1() {
        this.mockMvc.perform(get("/"))               // ④ 
                .andExpect(status().isOk)            // ⑤
                .andExpect(view().name("index"))     // ⑥
                .andExpect(xpath("/html/head/title").string("Title"))    // ⑦
                .andExpect(xpath("""//*[@id="name"]/@name""").string("name"))
                .andExpect(xpath("""//*[@id="name"]/@placeholder""").string("Name"))
                .andExpect(xpath("""//*[@id="name"]/@value""").string(""))
                .andExpect(xpath("""//*[@id="mail"]/@name""").string("mail"))
                .andExpect(xpath("""//*[@id="mail"]/@placeholder""").string("Mail"))
                .andExpect(xpath("""//*[@id="mail"]/@value""").string(""))
    }

}

-① Utilisé pour tester Spring avec JUnit. --② Utilisez @WebMvcTest pour tester la vue et le contrôleur à l'aide de MockMVC. --③ DI l'instance de MockMvc --④ Envoyer une demande GET --⑤ Vérifiez l'état HTTP. --⑥ Vérifiez que index.html est affiché sous forme de vue. --⑦ Vérifiez que chaque attribut de la zone de texte est correct. Vous pouvez obtenir la valeur d'attribut de la zone de texte par XPath

Lancer le test

Il peut être exécuté en tant que test JUnit à partir de l'EDI. Pour spécifier la classe de test à partir de gradlew, spécifiez comme suit.

./gradlew test --tests "package.ControllerTest"

Recommended Posts

Testez le contrôleur avec Mock MVC dans Spring Boot
Écrire du code de test avec Spring Boot
Contrôleur de cadre de test Spring avec Junit
Effectuer un test de confirmation de transaction avec Spring Boot
Test de validation de classe de formulaire avec Spring Boot
Exemple de code pour le test unitaire d'un contrôleur Spring Boot avec MockMvc
Cookie SameSite dans Spring Boot (Spring Web MVC + Tomcat)
Traitement asynchrone avec exécution régulière dans Spring Boot
Télécharger avec Spring Boot
Inclure le pot externe dans le package avec Spring boot2 + Maven3
Mémo d'utilisation de Spring Security: coopération avec Spring MVC et Boot
[Compatible JUnit 5] Ecrire un test en utilisant JUnit 5 avec Spring boot 2.2, 2.3
SSO avec GitHub OAuth dans l'environnement Spring Boot 1.5.x
[JUnit 5] Ecrivez un test de validation avec Spring Boot! [Test de paramétrage]
Testez la classe injectée sur le terrain dans le test de démarrage Spring sans utiliser le conteneur Spring
Jusqu'à ce que vous commenciez à développer avec Spring Boot dans eclipse 1
Jusqu'à ce que vous commenciez à développer avec Spring Boot dans eclipse 2
J'ai écrit un test avec Spring Boot + JUnit 5 maintenant
Création d'un environnement de base de données avec Docker dans Spring Boot (IntellJ)
Définir le paramètre contextuel dans Spring Boot
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Configuration Java avec Spring MVC
Implémenter GraphQL avec Spring Boot
[Spring] Test de sortie d'exception du contrôleur
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Multi-projets Spring Boot 2 avec Gradle
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Changements majeurs dans Spring Boot 1.5
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
NoHttpResponseException dans Spring Boot + WireMock
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Mémo de méthode de contrôleur de démarrage à ressort
MOCK les constructeurs d'autres classes avec Spring MVC + PowerMock + Junit
Utilisez thymeleaf3 avec le parent sans spécifier spring-boot-starter-parent dans Spring Boot
Utiliser l'authentification de base avec Spring Boot
Développement d'applications Spring Boot dans Eclipse
gRPC sur Spring Boot avec grpc-spring-boot-starter
Créez une application avec Spring Boot 2
Déploiement à chaud avec le développement Spring Boot
Liaison de base de données avec doma2 (Spring boot)
Programmation Spring Boot avec VS Code
Jusqu'à "Hello World" avec Spring Boot
Créer une application d'enquête avec Spring Boot
Obtenez des résultats de validation avec Spring Boot
Implémenter le téléchargement de fichiers avec Spring MVC
(Intellij) Hello World avec Spring Boot
Créez une application avec Spring Boot
Implémenter l'API REST avec Spring Boot
Qu'est-ce que @Autowired dans Spring Boot?
Google Cloud Platform avec Spring Boot 2.0.0