IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

[Spring Boot][WS Rest][JUnit] Erreur d'assertion lors d'un Test unitaire unitaire du controlleur


Sujet :

Services Web Java

  1. #1
    Membre habitué Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Points : 126
    Points
    126
    Par défaut [Spring Boot][WS Rest][JUnit] Erreur d'assertion lors d'un Test unitaire unitaire du controlleur
    Bonjour à tous,

    J'ai une application spring boot qui expose des WS REST via des contrôlleurs.
    Je suis en train d'écrire le test unitaire d'un contrôleur. Et j'ai une erreur d'assertion qui dit que le statut attendu est 200 mais il était 404.

    Voilà le code du contrôleur à tester (je mets uniquement le code du ws que je veux tester):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    @Component
    @Log4j2
    @Path("/demande")
    @Produces({ MediaType.APPLICATION_JSON })
    @RolesAllowed(HabilitationsManager.ROLE_ADM)
    public class DemandeRestController {
    //Some services ....
    //WS à tester
    @GET
    	@Path("/donnees/{idDecla}")
    	@Produces({MediaType.APPLICATION_JSON})
    	public Response getDonnees(@PathParam("idDecla") Long idDecla){
     
    		try{
    			DonneesDto donnees =  demandeService.getDonnees(idDecla);
    			return Response.status(200).entity(donnees).build(); 	
    		}catch(FonctionnelleException e){
    			return Response.status(500).entity(new ExceptionDto("Recherche de donnée", e.getMessage())).build(); 	
    		}
     
    	}
    Voilà le code du TU de mon contrôleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    @RunWith(SpringJUnit4ClassRunner.class)
    @WebMvcTest(DemandeRestController.class)
    @WebAppConfiguration
    public class DemandeRestControllerTest {
     
     
    	//#########################################
    	//~ Attributs.
    	//#########################################
    	@Autowired
    	private MockMvc mvc;
     
    	@MockBean
    	private DemandeRestController demandeRestController;
     
    	@MockBean
    	private DemandeService demandeService;
     
    	@Autowired
        WebApplicationContext wac;
     
    	//#########################################
    	//~ Initialisation du context de tests.
    	//#########################################
    	@Before
    	public void setup() {
    		// this must be called for the @Mock annotations above to be processed.
            MockitoAnnotations.initMocks(this);
            this.mvc = MockMvcBuilders.webAppContextSetup(this.wac).dispatchOptions(true).build();
        }
           //#########################################
    	//~ Tests.
    	//#########################################
    	@Test
    	public void getDonneesTest_success() throws Exception{
     
    		//Given
    		Long idDeclaration = 1L;
                    DonneesDto donne = new DonneesDto();
                    Response reponse =  Response.status(200).entity(donne).build();
     
    		URI uri = new URI("/rest/demande/donnees/19");
     
    		//When
    		given(demandeService.getDonnees(idDeclaration)).willReturn(donne);
     
    		//Then
    		ResultMatcher  rm = MockMvcResultMatchers.jsonPath("reponse", is(reponse));
    		((ResultActions) mvc.perform(get(uri)))
    			.andExpect(status().isOk())
    			.andExpect(rm);
    }
    Et voilà le résultat du JUnit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    java.lang.AssertionError: Status expected:<200> but was:<404>
    	at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:54)
    	at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:81)
    	at org.springframework.test.web.servlet.result.StatusResultMatchers$10.match(StatusResultMatchers.java:665)
    	at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:171)
    	at fr.bnf.isnidem.test.rest.DemandeRestControllerTest.getDonneesTest_success(DemandeRestControllerTest.java:145)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
    	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
    	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
    	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
    Des idées ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Le param de new URI() ne correspond pas à vos @Path.

  3. #3
    Membre habitué Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Points : 126
    Points
    126
    Par défaut
    J'ai changé mon test à ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    RequestBuilder requestBuilder = MockMvcRequestBuilders.get(
    				"/rest/demande/donnees/19").accept(
    				MediaType.APPLICATION_JSON);
     
    		//When
    		given(demandeService.getDonnees(idDeclaration)).willReturn(donneBibliographique);
     
    		//Then
    		MvcResult result = ((ResultActions) mvc.perform(requestBuilder)).andReturn();
    Et ça marche.

    Je veux comprendre pourquoi ça ne marche pas en utilisant URI :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    URI uri = new URI("/rest/demande/donnees/19");
     
    		//When
    		given(demandeService.getDonnees(idDeclaration)).willReturn(donne);
     
    		//Then
    		ResultMatcher  rm = MockMvcResultMatchers.jsonPath("reponse", is(reponse));
    		((ResultActions) mvc.perform(get(uri)))
    			.andExpect(status().isOk())
    			.andExpect(rm);
    Je ne pense pas que l'url soit incorrecte, non ?

  4. #4
    Membre habitué Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Points : 126
    Points
    126
    Par défaut
    Le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Response reponse =  Response.status(200).entity(donne).build();
     
    		RequestBuilder requestBuilder = MockMvcRequestBuilders.get(
    				"/demande/donnees/19")
    				.param("idDecla", "19")
    				.accept(MediaType.APPLICATION_JSON);
     
    		//When
    		given(demandeService.getDonnees(idDeclaration)).willReturn(donne);
     
    		//Then
    		MvcResult result = ((ResultActions) mvc.perform(requestBuilder)).andReturn();
     
    		System.out.println(reponse.getStatus());
    		System.out.println(result.getResponse().getStatus());
     
    		assertEquals(result.getResponse().getStatus(), reponse.getStatus());
    Me donne le resultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.lang.AssertionError: expected:<404> but was:<200>

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par JQueen Voir le message
    J'ai changé mon test à ce qui suit :

    [CODE]
    Je veux comprendre pourquoi ça ne marche pas en utilisant URI :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    URI uri = new URI("/rest/demande/donnees/19");
     
            //When
            given(demandeService.getDonnees(idDeclaration)).willReturn(donne);
     
            //Then
            ResultMatcher  rm = MockMvcResultMatchers.jsonPath("reponse", is(reponse));
            ((ResultActions) mvc.perform(get(uri)))
                .andExpect(status().isOk())
                .andExpect(rm);
    Je ne pense pas que l'url soit incorrecte, non ?
    manque le accept(MediaType.APPLICATION_JSON);

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par JQueen Voir le message
    Le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Response reponse =  Response.status(200).entity(donne).build();
     
            RequestBuilder requestBuilder = MockMvcRequestBuilders.get(
                    "/demande/donnees/19")
                    .param("idDecla", "19")
                    .accept(MediaType.APPLICATION_JSON);
     
            //When
            given(demandeService.getDonnees(idDeclaration)).willReturn(donne);
     
            //Then
            MvcResult result = ((ResultActions) mvc.perform(requestBuilder)).andReturn();
     
            System.out.println(reponse.getStatus());
            System.out.println(result.getResponse().getStatus());
     
            assertEquals(result.getResponse().getStatus(), reponse.getStatus());
    Me donne le resultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.lang.AssertionError: expected:<404> but was:<200>
    si les autres marchent avec /rest/demande pourquoi essayez-vous sans le /rest maintenant ?

    et pas besoin de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .param("idDecla", "19")

  7. #7
    Membre habitué Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Points : 126
    Points
    126
    Par défaut
    @JeitEmgie

    si les autres marchent avec /rest/demande pourquoi essayez-vous sans le /rest maintenant ?
    En fait, je voulais dire que le test fonctionne sans assertion.
    L'ajout ou pas de /rest donne toujours le même résultat.

Discussions similaires

  1. [API HTML5] Erreur IE "SCRIPT5007" lors d'un test d'animation HTML 5.
    Par BugFactory dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 10/01/2013, 15h17
  2. REST DELETE : Erreur 403 (spring)
    Par dewsz dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 15/07/2008, 18h31
  3. [Integration] [JUnit] Erreur de chargement du fichier de config Spring
    Par Esil2008 dans le forum Spring
    Réponses: 3
    Dernier message: 18/07/2007, 10h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo