我编写了一个测试 UsersController 的单元测试。 UsersControllerTest.findUser 工作正常,但 UsersControllerTest.insertGetModifyDelete 却不行。

在测试日志中我可以看到 POST 请求不匹配 UsersController 的任何方法,但我不明白为什么。你能帮我解决这个问题吗?

这是我的休息java类:

@RestController 
@RequestMapping("/users") 
public class UsersController { 
 
    private final UsersService usersService; 
 
    @Autowired 
    public UsersController(UsersService usersService) { 
        this.usersService = usersService; 
    } 
 
    @GetMapping(value="/{email}", produces="application/json") 
    public User get(@PathVariable @Email String email) { 
        return usersService.findByEmail(email); 
    } 
 
    @PostMapping(consumes="application/json", produces="application/json") 
    @ResponseBody 
    public ResponseEntity<String> insert(@RequestBody @Valid User user){ 
        usersService.insert(user); 
        return ResponseEntity.ok(user.getEmail()); 
    } 
 
    @DeleteMapping(value="/{email}", consumes="application/json", produces="application/json") 
    public ResponseEntity<String> delete(@PathVariable @Email String email) { 
        usersService.delete(email); 
        return ResponseEntity.ok(email); 
    } 
 
    @PutMapping(value="/{email}", consumes="application/json", produces="application/json") 
    public ResponseEntity<User> update(@PathVariable @Email String email, @RequestBody @Valid User user) { 
        usersService.update(email, user); 
        return ResponseEntity.ok(user); 
    } 
 
} 

我有一个测试有两种方法。一个正在返回 http 代码 200,但另一个返回 403。

@RunWith(SpringRunner.class) 
@SpringBootTest 
@AutoConfigureMockMvc 
@WithMockUser(username = "user", roles = "USER") 
public class UsersControllerTest { 
 
 
    @Autowired 
    private MockMvc mockMvc; 
 
    @Test 
    public void findUser() throws Exception { 
        mockMvc.perform(get("/users/{email}", new Object[] {"boy@test.com"})).andExpect(status().isOk()).andExpect(jsonPath("$.email", equalTo("boy@test.com"))).andExpect(jsonPath("$.userName", equalTo("boy"))); 
    } 
 
    @Test 
    public void insertGetModifyDelete() throws Exception { 
        User user = new User("userName", "email@email.com"); 
        ObjectMapper mapper = new ObjectMapper(); 
        String json = mapper.writeValueAsString(user); 
        mockMvc.perform(post("/users").content(json).contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()); 
        mockMvc.perform(put("/users/{email}", new Object[] {user.getEmail()}).content(json)).andDo(print()).andExpect(status().isOk()); 
        mockMvc.perform(delete("/users/{email}", new Object[] {user.getEmail()}).content(json)).andDo(print()).andExpect(status().isOk()); 
    } 
 
} 

这是测试的输出:

MockHttpServletRequest: 
      HTTP Method = GET 
      Request URI = /users/boy@test.com 
       Parameters = {} 
          Headers = {} 
             Body = null 
    Session Attrs = {SPRING_SECURITY_CONTEXT=org.springframework.security.core.context.SecurityContextImpl@ca25360: Authentication: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@ca25360: Principal: org.springframework.security.core.userdetails.User@36ebcb: Username: user; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: null; Granted Authorities: ROLE_USER} 
 
Handler: 
             Type = es.tododev.fairtasks.rest.UsersController 
           Method = public es.tododev.fairtasks.dto.User es.tododev.fairtasks.rest.UsersController.get(java.lang.String) 
 
Async: 
    Async started = false 
     Async result = null 
 
Resolved Exception: 
             Type = null 
 
ModelAndView: 
        View name = null 
             View = null 
            Model = null 
 
FlashMap: 
       Attributes = null 
 
MockHttpServletResponse: 
           Status = 200 
    Error message = null 
          Headers = {Content-Disposition=[inline;filename=f.txt], Content-Type=[application/json;charset=UTF-8], X-Content-Type-Options=[nosniff], X-XSS-Protection=[1; mode=block], Cache-Control=[no-cache, no-store, max-age=0, must-revalidate], Pragma=[no-cache], Expires=[0], X-Frame-Options=[DENY]} 
     Content type = application/json;charset=UTF-8 
             Body = {"userName":"boy","email":"boy@test.com"} 
    Forwarded URL = null 
   Redirected URL = null 
          Cookies = [] 
 
MockHttpServletRequest: 
      HTTP Method = POST 
      Request URI = /users 
       Parameters = {} 
          Headers = {Content-Type=[application/json;charset=UTF-8], Accept=[application/json]} 
             Body = {"userName":"userName","email":"email@email.com"} 
    Session Attrs = {org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.CSRF_TOKEN=org.springframework.security.web.csrf.DefaultCsrfToken@66944c7c, SPRING_SECURITY_CONTEXT=org.springframework.security.core.context.SecurityContextImpl@ca25360: Authentication: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@ca25360: Principal: org.springframework.security.core.userdetails.User@36ebcb: Username: user; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: null; Granted Authorities: ROLE_USER} 
 
Handler: 
             Type = null 
 
Async: 
    Async started = false 
     Async result = null 
 
Resolved Exception: 
             Type = null 
 
ModelAndView: 
        View name = null 
             View = null 
            Model = null 
 
FlashMap: 
       Attributes = null 
 
MockHttpServletResponse: 
           Status = 403 
    Error message = Forbidden 
          Headers = {X-Content-Type-Options=[nosniff], X-XSS-Protection=[1; mode=block], Cache-Control=[no-cache, no-store, max-age=0, must-revalidate], Pragma=[no-cache], Expires=[0], X-Frame-Options=[DENY]} 
     Content type = null 
             Body = 
    Forwarded URL = null 
   Redirected URL = null 
          Cookies = [] 
[ERROR] Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 6.155 s <<< FAILURE! - in es.tododev.fairtasks.rest.UsersControllerTest 
[ERROR] insertGetModifyDelete(es.tododev.fairtasks.rest.UsersControllerTest)  Time elapsed: 0.028 s  <<< FAILURE! 
java.lang.AssertionError: Status expected:<200> but was:<403> 
        at es.tododev.fairtasks.rest.UsersControllerTest.insertGetModifyDelete(UsersControllerTest.java:48) 

请您参考如下方法:

您可以尝试调试这个程序。我认为问题发生在“mockMvc”对象不是 Autowiring 的。mockMvc 对象应该在程序运行之前从 WebApplicationContext 加载。

@Autowired 
private WebApplicationContext webApplicationContext 
 
@Before() 
public void setup() 
{ 
    //Init MockMvc Object and build 
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
} 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!