ユニットテストSpringbootMockMvcは403Forbiddenを返します
UsersControllerをテストする1つの単体テストを作成しました。 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);
}
}
2つの方法で1つのテストがあります。 1つはhttpコード200を返すように機能していますが、もう1つは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」オブジェクトで発生していると思います。autowiredではありません。mockMvcオブジェクトは、プログラムの実行前にWebApplicationContextからロードする必要があります。
@Autowired
private WebApplicationContext webApplicationContext
@Before()
public void setup()
{
//Init MockMvc Object and build
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@AutoConfigureMockMvc(addFilters = false)
で回避しました。これにより、HTTPスタックの他の機能が損なわれないことを確認してください。