mockmvc test post请求返回错误:实际调用有不同的参数:

6mw9ycah  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(496)

这个问题在这里已经有答案了

mockito中的测试失败消息:参数不同!需要:(2个答案)
上个月关门了。
我是后端测试的新手,我正在用mockmvc测试我的spring启动应用程序。但是,当我想测试我的post请求时,我在使用时遇到了标题中提到的错误

  1. verify(userService,atLeastOnce()).addUser(user1);

错误日志如下:

  1. {"id":1,"name":"Burakhan Aksoy","email":"burak@burak.com","gender":"Male","phoneNumber":"12321"}
  2. MockHttpServletRequest:
  3. HTTP Method = POST
  4. Request URI = /users
  5. Parameters = {}
  6. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"96"]
  7. Body = {"id":1,"name":"Burakhan Aksoy","email":"burak@burak.com","gender":"Male","phoneNumber":"12321"}
  8. Session Attrs = {}
  9. Handler:
  10. Type = io.thebman.restapitesting.controllers.UserController
  11. Method = io.thebman.restapitesting.controllers.UserController#addUser(User)
  12. Async:
  13. Async started = false
  14. Async result = null
  15. Resolved Exception:
  16. Type = null
  17. ModelAndView:
  18. View name = null
  19. View = null
  20. Model = null
  21. FlashMap:
  22. Attributes = null
  23. MockHttpServletResponse:
  24. Status = 201
  25. Error message = null
  26. Headers = [Content-Type:"application/json"]
  27. Content type = application/json
  28. Body = {"id":1,"name":"Burakhan Aksoy","email":"burak@burak.com","gender":"Male","phoneNumber":"12321"}
  29. Forwarded URL = null
  30. Redirected URL = null
  31. Cookies = []
  32. Argument(s) are different! Wanted:
  33. io.thebman.restapitesting.service.UserService#0 bean.addUser(
  34. io.thebman.restapitesting.view.User@1b5a1d85
  35. );
  36. -> at io.thebman.restapitesting.UserControllerTest.postUserThenValidateUserAddedSuccessfully(UserControllerTest.java:119)
  37. Actual invocations have different arguments:
  38. io.thebman.restapitesting.service.UserService#0 bean.addUser(
  39. io.thebman.restapitesting.view.User@31e130bf
  40. );
  41. -> at io.thebman.restapitesting.controllers.UserController.addUser(UserController.java:32)
  42. Comparison Failure:
  43. <Click to see difference>
  44. Argument(s) are different! Wanted:
  45. io.thebman.restapitesting.service.UserService#0 bean.addUser(
  46. io.thebman.restapitesting.view.User@1b5a1d85
  47. );
  48. -> at io.thebman.restapitesting.UserControllerTest.postUserThenValidateUserAddedSuccessfully(UserControllerTest.java:119)
  49. Actual invocations have different arguments:
  50. io.thebman.restapitesting.service.UserService#0 bean.addUser(
  51. io.thebman.restapitesting.view.User@31e130bf
  52. );
  53. -> at io.thebman.restapitesting.controllers.UserController.addUser(UserController.java:32)
  54. at io.thebman.restapitesting.UserControllerTest.postUserThenValidateUserAddedSuccessfully(UserControllerTest.java:119)
  55. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  56. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  57. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  58. at java.lang.reflect.Method.invoke(Method.java:498)
  59. at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
  60. at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
  61. at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
  62. at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
  63. at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
  64. at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
  65. at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
  66. at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
  67. at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
  68. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
  69. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
  70. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
  71. at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
  72. at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
  73. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210)
  74. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  75. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206)
  76. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131)
  77. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65)
  78. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
  79. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  80. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
  81. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  82. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
  83. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  84. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
  85. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
  86. at java.util.ArrayList.forEach(ArrayList.java:1259)
  87. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
  88. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
  89. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  90. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
  91. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  92. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
  93. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  94. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
  95. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
  96. at java.util.ArrayList.forEach(ArrayList.java:1259)
  97. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
  98. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
  99. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  100. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
  101. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  102. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
  103. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  104. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
  105. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
  106. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
  107. at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
  108. at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
  109. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
  110. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
  111. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
  112. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
  113. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
  114. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)
  115. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)
  116. at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
  117. at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
  118. at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
  119. at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)

我的usercontroller类如下所示:

  1. package io.thebman.restapitesting.controllers;
  2. import io.thebman.restapitesting.service.UserService;
  3. import io.thebman.restapitesting.view.User;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.http.HttpStatus;
  6. import org.springframework.http.ResponseEntity;
  7. import org.springframework.web.bind.annotation.*;
  8. import java.util.List;
  9. @RestController
  10. public class UserController {
  11. @Autowired
  12. private UserService userService;
  13. @RequestMapping("/users/{id}")
  14. public User getUserById(@PathVariable int id){
  15. return userService.getUser(id);
  16. }
  17. @RequestMapping("/users")
  18. public List<User> getUsers(){
  19. return userService.getUsers();
  20. }
  21. @PostMapping("/users")
  22. public @ResponseBody
  23. ResponseEntity<User> addUser(@RequestBody User user){
  24. return new ResponseEntity<User>(userService.addUser(user), HttpStatus.CREATED);
  25. }
  26. }

我的usercontrollertest类如下所示:

  1. package io.thebman.restapitesting;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import io.thebman.restapitesting.controllers.UserController;
  4. import io.thebman.restapitesting.service.UserService;
  5. import io.thebman.restapitesting.view.User;
  6. import org.junit.jupiter.api.Test;
  7. import org.mockito.ArgumentMatchers;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
  10. import org.springframework.boot.test.mock.mockito.MockBean;
  11. import org.springframework.http.MediaType;
  12. import org.springframework.test.web.servlet.MockMvc;
  13. import org.springframework.test.web.servlet.ResultMatcher;
  14. import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
  15. import org.springframework.test.web.servlet.result.ContentResultMatchers;
  16. import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
  17. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
  18. import static org.hamcrest.MatcherAssert.assertThat;
  19. import static org.hamcrest.Matchers.*;
  20. import java.util.Arrays;
  21. import java.util.List;
  22. import static org.mockito.ArgumentMatchers.any;
  23. import static org.mockito.Mockito.*;
  24. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
  25. @WebMvcTest(UserController.class)
  26. public class UserControllerTest {
  27. @Autowired
  28. private UserController userController;
  29. @Autowired
  30. private MockMvc mockMvc;
  31. @MockBean
  32. private UserService userService;
  33. //Test /users (POST)
  34. @Test
  35. public void postUserThenValidateUserAddedSuccessfully() throws Exception {
  36. User user1 =new User(1,"Burakhan Aksoy",
  37. "burak@burak.com","Male",
  38. "12321");
  39. when(userService.addUser(any(User.class))).thenReturn(user1);
  40. //Start mocking http request
  41. mockMvc.perform(MockMvcRequestBuilders.post("/users")
  42. .contentType(MediaType.APPLICATION_JSON)
  43. .content(asJsonString(new User(1,"Burakhan Aksoy",
  44. "burak@burak.com","Male",
  45. "12321"))))
  46. .andExpect(status().isCreated())
  47. .andExpect(jsonPath("$.id").exists())
  48. .andExpect(jsonPath("$.name").value("Burakhan Aksoy"))
  49. .andExpect(jsonPath("$.email").value("burak@burak.com"))
  50. .andExpect(jsonPath("$.gender").value("Male"))
  51. .andExpect(jsonPath("$.phoneNumber").value("12321"));
  52. verify(userService,atLeastOnce()).addUser(user1);
  53. // verifyNoMoreInteractions(userService);
  54. }
  55. public static String asJsonString(final Object obj) {
  56. try {
  57. final ObjectMapper mapper = new ObjectMapper();
  58. final String jsonContent = mapper.writeValueAsString(obj);
  59. System.out.println(jsonContent);
  60. return jsonContent;
  61. } catch (Exception e) {
  62. throw new RuntimeException(e);
  63. }
  64. }
  65. }

感谢您的帮助
最好的,

jexiocij

jexiocij1#

尝试重载默认值 hashCode() 以及 equals() 方法。
在您的场景中,它考虑两个不同的对象,并基于默认对象的方法进行比较,该方法检查地址。
编辑:作为这个测试用例的一部分,您只需要重写 equals() 方法。但没能超越 hashCode() ,以后使用任何 Hash 相关收藏,如 HashTable, HashMap etc. 请参阅本文了解更多详细信息:为什么需要重写java中的equals和hashcode方法?

相关问题