web-dev-qa-db-fra.com

MockMVC et Mockito renvoient le statut attendu <200> mais égal à <415>.

Je teste un point final api qui fonctionne à partir d'une affiche http (à savoir Paw), mais je ne peux pas obtenir de test dans le code pour réussir.

Je suis nouveau chez Mockito et MockMVC, toute aide serait la bienvenue.

Test ci-dessous:

 @Test
 public void createPaymentTest() throws Exception {
    User user = new User("ben", "password", "[email protected]");

    SuccessResponseDTO successDTO = new SuccessResponseDTO();
    successDTO.setSuccess(true);

    when(userService.getLoggedInUser()).thenReturn(user);
    when(paymentService.makePayment(Mockito.any(PaymentRequestDTO.class), Mockito.any(User.class))).thenReturn(successDTO.getSuccess());

    this.mockMvc.perform(post("/payment")).andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON)).andDo(MockMvcResultHandlers.print())
            .andExpect(jsonPath("$.success").value(successDTO.getSuccess()));

}

SuccessResponseDTO ne contient qu'un attribut, un "succès" booléen.

La méthode testée est la suivante:

@RequestMapping(value = "/payment", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public SuccessResponseDTO createPayment(@RequestBody PaymentRequestDTO payment) {
    User loggedInUser = userService.getLoggedInUser();
    LOGGER.info("Logged in user found...creating payment...");

    Assert.notNull(payment.getAccountId(), "Missing user account id");
    Assert.notNull(payment.getPayeeAccountNumber(), "Missing payee acount number");
    Assert.notNull(payment.getPayeeName(), "Missing payee name");
    Assert.notNull(payment.getPayeeSortCode(), "Missing payee sort code");
    Assert.notNull(payment.getPaymentAmount(), "Missing payee amount");
    Assert.notNull(payment.getPaymentDescription(), "Missing payment description");

    Boolean paymentResult = paymentService.makePayment(payment, loggedInUser);

    SuccessResponseDTO successResponse = new SuccessResponseDTO();

    successResponse.setSuccess(paymentResult);

    return successResponse;
}

Quelqu'un peut-il éclairer la trace de la pile:

Java.lang.AssertionError: Status expected:<200> but was:<415>
at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.Java:60)
at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.Java:89)
at org.springframework.test.web.servlet.result.StatusResultMatchers$5.match(StatusResultMatchers.Java:546)
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.Java:141)
at com.capco.living.controller.PaymentControllerTest.createPaymentTest(PaymentControllerTest.Java:69)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.Java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.Java:26)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.Java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:309)
at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:50)
at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:467)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:683)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:390)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:197)
15
Ben Taliadoros

Erreur HTTP 415 Type de support non pris en charge - signifie que vous envoyez les données qui ne sont pas prises en charge par le service. Dans ce cas, cela signifie que vous ne définissez pas l'en-tête Content-Type et le contenu réel dans la demande. Je suppose que le JSON est le contenu attendu, votre appel devrait donc ressembler à ceci:

this.mockMvc.perform(post("/payment").contentType(MediaType.APPLICATION_JSON)
    .content("{\"json\":\"request to be send\"}"))
    .andExpect(status().isOk())
    .and_the_rest_of_validation_part
23
swist

Il se peut également que certaines annotations soient manquantes sur votre classe de contrôleur. Assurez-vous d'utiliser @EnableWebMvc et @Controller

Découvrez cette réponse pour plus de détails

8
Ann Kilzer

Aussi, vous pourriez ajouter accepter

 mockMvc.perform(post("/api/sender/sms/")
            .accept(MediaType.APPLICATION_JSON_UTF8)
            .contentType(MediaType.APPLICATION_JSON_UTF8)
            .content("{ \"serviceName\":\"serviceName\",  \"apiId\":\"apiId\",  \"to\":\"to\",  \"msg\":\"msg\" }")
    )
        .andExpect(MockMvcResultMatchers.status().isOk())
        .andReturn();
0
Sergey Yurov