0
votes

Démarrage de printemps: Resttemplate Post Call ne renvoie pas le code d'état créé

Je suis nouveau dans le modèle de repos de démarrage de printemps. J'essaie d'écrire un boîtier de test d'unité pour le modèle de repos post-appel. J'ai créé un contrôleur d'utilisateur pour envoyer les données factices. L'Usercontroller est-il écrit pour Post Call est correct pour le test de l'unité? Sinon, quelle est la bonne façon de l'écrire? Est-ce que la réponse que je reviendrai de Usercontroller est-elle correcte? Devrais-je retourner le code d'état comme 200 ou 201? Est-ce que quelqu'un peut m'aider?

ci-dessous est l'Usercontroller P>

@Test
    public void testSuccessPostUser() throws Exception{
        String baseUrl = "http://localhost:8080/users";
        List<String> messages = new ArrayList<>();
        messages.add("Hi");

        User user = new User();
        user.setId(1);
        user.setName("John");
        user.setAge(22);
        user.setMessages(messages);

        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

        HttpEntity<User> httpEntity = new HttpEntity<>(user, httpHeaders);

        HttpHandler httpHandler = new HttpHandler();
        ResponseEntity<User>  actual = httpHandler.sendPost(baseUrl, httpHeaders, user, User.class);

        //verify request succeed
        assertEquals(HttpStatus.CREATED, actual.getStatusCode());
        assertEquals(201, actual.getStatusCodeValue());
        assertTrue(responseBody.contains(id);
    }


0 commentaires

3 Réponses :


1
votes

POST renvoie 200 par défaut.

Si vous voulez le rendre Retour 201 Ajouter ceci: P>

@ResponseStatus(HttpStatus.CREATED)
@PostMapping("/users")
public User createUser(@RequestBody User user){


0 commentaires

1
votes

Si vous souhaitez renvoyer des codes d'état personnalisés, vous devez retourner REPSPSSONSentialité : xxx

Si vous souhaitez connaître les statuts HTTPS corrects pour une méthode postale, je suggère de Lisez ceci: Quel code d'état devrions-nous retourner si le poste réussit mais n'entraîne rien de nouveau?


0 commentaires

1
votes

Tout d'abord, pour tester le contrôleur HTTP, vous pouvez utiliser mockmvc code>.

Exemples Test: P>

mockMvc.perform(post("/users")
       .contentType(MediaType.APPLICATION_JSON)
       .content("{ "id": 1, "Name": "John", "Age": 22 }") 
       .accept(MediaType.APPLICATION_JSON))
       .andExpect(status().isCreated())
       .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
       .andExpect(jsonPath("$.id").value($id)) 
       .andExpect(jsonPath("$.value").value("some-value"));


7 commentaires

Merci de me corriger si je me trompe, n'utilisons pas MockMVC pour des tests d'intégration?


Oui, c'est correct, mais je suppose que votre cas est un test d'intégration :)


J'écris un test d'unité. Quelle est la bonne façon de l'écrire?


Vous appelez un point de terminal http: // localhost: 8080 / utilisateurs , s'il n'est pas stupéfait, votre type de test est d'intégration. MockMVC fournit une API élégante et facile à utiliser pour appeler des points d'extrémité Web et inspecter et affirmer sa réponse en même temps. Vous devez ajouter @ContextConfiguration et @webappconfiguration pour tester le contexte de ressort pour les tests.


J'utilise Junit5 pour écrire des cas de test de l'unité. J'utilise @springboottest Annotation. Est-ce que j'ai encore besoin @contextconfiguration et @webappconfiguration ? En outre, lorsque vous dites préparant le contexte de printemps pour tester ce que signifie exactement?


@SpringbootTest est exécutant le printemps contextuel complet. C'est juste assez pour toi. Maintenant, il suffit d'ajouter @Autowire MockMVC MockMVC et utilisez-le dans Test :) @webappconfiguration, cela ne fonctionne que la couche Web.


Bien sûr, ajoutera MockMVC et l'utilisera dans le test. Merci pour votre temps et votre aide.