[JAVA] Tester la réponse JSON de l'API REST créée par Spring MVC à l'aide d'AssertJ avec MockMvc

Chose que tu veux faire

Lors du test de la réponse API REST créée à l'aide de @RestController de Spring MVC à l'aide de MockMVC, utilisez AssertJ pour tester la réponse JSON.

Qu'est-ce que MockMVC

Un mécanisme pour tester les requêtes et réponses HTTP au contrôleur sans démarrer le serveur fourni par Spring. Puisque le serveur n'est pas démarré lorsque le test est exécuté, il y a un avantage que la vitesse d'exécution du test est augmentée. Vous pouvez lancer le contexte de l'application Spring en utilisant @AutoConfigureMockMvc, qui vous permet de faire la DI comme vous le feriez lors du lancement de l'application entière.

Site de référence: [Testing the Web Layer](Class ContentResultMatchers)

Raisons d'utiliser AssertJ

Tester avec MockMVC + @ AutoConfigureMockMvc a l'avantage de pouvoir tester l'ensemble de l'application à grande vitesse, J'ai senti que le mécanisme de vérification du JSON renvoyé par RestController était faible. Il existe également une méthode pour comparer le JSON de la réponse avec le résultat attendu, mais vous devez transmettre le JSON du résultat attendu sous forme de chaîne de caractères.

Site de référence: Class ContentResultMatchers

Par exemple, envisagez de tester un RestContorller qui renvoie une liste de livres comme celle-ci:

Classe de réponse

Book.java



@Data
public class Book {

    private int id;
    private String name;
    private String author;
}

Books.java


@Data
@NoArgsConstructor
@AllArgsConstructor
public class Books {

    private List<Book> books;
}

Classe de contrôleur

BookController


@RestController
public class BookController {

    //Classe de service qui renvoie une liste de livres
    private final BookService bookService;

    @Autowired
    public BookController(BookService bookService) {
        this.bookService = bookService;
    }

    @GetMapping("books")
    public Books get() {

        //Obtenir et retourner la liste des livres avec service
        return bookService.getBooks();
    }
}

Dans la classe ContentResultMatchers, il existe une méthode publique ResultMatcher json (String jsonContent) pour vérifier JSON Il est préparé. Lorsque vous utilisez cette méthode json, transmettez la chaîne de caractères JSON du résultat attendu comme argument. Dans la méthode json, la chaîne transmise est convertie en objet JSON, puis comparée à la réponse du programme testé.

BookControllerTest



@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class BookControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void test() throws Exception {

        String expectedJson = "{books:[...]}";  //Créer JSON du résultat attendu sous forme de chaîne de caractères

        mockMvc.perform(get("/books"))
                .andExpect(status().isOk()) //Vérifiez le code d'état de la réponse
                .andExpect(content().json(expectedJson)); //Vérifiez le JSON de la réponse
    }
}

J'ai écrit un test avec la méthode json, mais j'ai pensé comme suit.

-S'il y a beaucoup d'éléments JSON, il est difficile de créer une chaîne de caractères JSON avec le résultat attendu. De plus, comme la complétion IDE ne fonctionne pas avec les chaînes de caractères, des fautes de frappe sont susceptibles de se produire. ↓ -Il semble qu'il y ait moins d'erreurs si vous créez un objet Java et le convertissez en chaîne de caractères avec Jackson. ↓ -Si vous créez un objet Java, n'est-il pas plus efficace de convertir les valeurs renvoyées par MockMVC en objets Java et de les comparer? N'est-il pas plus pratique d'utiliser AssertJ pour la comparaison entre les objets car il a plus de correspondance?

Procédure pour convertir la valeur de retour de MockMVC en objet et comparer avec AssertJ

MockMVC fournit une méthode qui peut obtenir le corps de la réponse sous forme de chaîne de caractères, utilisez donc ceci. Convertissez la chaîne de caractères acquise en un objet avec Jackson et comparez-le au résultat attendu en utilisant AssertJ. Le code ressemble à ceci:

BookControllerTest



@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class BookControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void test() throws Exception {

        String responseJsonString = mockMvc.perform(get("/books"))
                .andExpect(status().isOk())
                .andReturn().getResponse().getContentAsString(); //Obtenir le corps de la réponse sous forme de chaîne

        ObjectMapper objectMapper = new ObjectMapper();

        //Convertir en objet Java dans Jackson
        Books responseJson = objectMapper.readValue(responseJsonString, Books.class);

        //Créer les résultats attendus avec des objets Java
        Books expected = new Books(new ArrayList<>());

        //Comparaison
        assertThat(responseJson).isEqualTo(expected);

    }
}

finalement

S'il est préférable d'utiliser la méthode json qui a été préparée à l'origine, cela dépend du contenu du JSON renvoyé par l'API cible, et je pense qu'il y a aussi une préférence. J'espère qu'il sera utile de savoir qu'il existe une telle méthode.

Recommended Posts

Tester la réponse JSON de l'API REST créée par Spring MVC à l'aide d'AssertJ avec MockMvc
Demande de Json dans le test unitaire du contrôleur à l'aide de MockMvc
Test API souvent utilisé dans AssertJ
Implémenter l'API REST avec Spring Boot
Formulaire qui reçoit la valeur de l'élément répétitif dans Spring MVC
Paramètres lors de l'appel de l'API à l'aide des mesures CSRF de Spring Security dans JMeter
Essayez d'utiliser l'API Stream en Java
Essayez d'utiliser l'API au format JSON en Java
[Java] [Spring] Tester le comportement de l'enregistreur
Essayez d'utiliser l'API au format JSON en Java
Testez le contrôleur avec Mock MVC dans Spring Boot
ChatWork4j pour l'utilisation de l'API ChatWork en Java
Le nom officiel de Spring MVC est Spring Web MVC
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java
Spécifiez le codage des ressources statiques dans Spring Boot
[Pour les débutants] DI ~ Les bases de DI et DI au printemps ~
Obtenez le nom du scénario de test dans la classe de test JUnit
J'ai résumé le format d'affichage de la réponse JSON de Rails
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 2)
Testez la classe injectée sur le terrain dans le test de démarrage Spring sans utiliser le conteneur Spring
Présentez swagger-ui à l'API REST implémentée dans Spring Boot
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 1)
Découvrons comment recevoir avec Request Body avec l'API REST de Spring Boot