junit mockito将相同的对象用于控制器和服务方法

时间:2018-10-24 10:44:24

标签: unit-testing spring-mvc junit mockito

我的控制器

@RequestMapping(value="/login", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
        public User login(@RequestBody User user){
            User u = userService.validateUser(user);
            if(u != null){
                return u;
            }
            return null;
        }

这是我对控制器的测试用例

@Test
    public void testUserController() throws Exception {
         User u = new User();
         u.setEmail("12a@gm.com");
         u.setPassword("00000");
         Gson gson = new Gson();
         String data = gson.toJson(u);
         when(userService.validateUser(u)).thenReturn(new User());
         String response = mockMvc.perform(post("/login").contentType(MediaType.APPLICATION_JSON).content(data)).andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
         assertTrue(response.equals("hi"));
    }

我正在将User对象转换为字符串,并将其发布到controller方法。我正在尝试模拟服务方法,其中userService.validateUser()将返回新的空User对象。由于发布到服务方法的对象与控制器接收的对象不同,因此服务返回null。如何使服务方法返回空用户对象?

1 个答案:

答案 0 :(得分:0)

您在测试用例中创建的用户对象(通过mockMvc传递)是通过login方法传递的对象的另一个实例。

您可以在when().then()中使用通配符接受:

when(userService.validateUser(Mockito.any(User.class))).thenReturn(new User());

或我将使用的语法:

doReturn(new User()).when(userService).validateUser(Mockito.any(User.class));