Spring boot MockMvc响应返回404,预期响应201
我不熟悉在Spring Boot中对RESTAPI进行单元测试 我期望响应状态为CREATED,但我得到的却是一个PAGE NOT FOUND错误 以下是代码:- UserControllerUnitTestsSpring boot MockMvc响应返回404,预期响应201,spring-boot,rest,spring-mvc,junit,mockito,Spring Boot,Rest,Spring Mvc,Junit,Mockito,我不熟悉在Spring Boot中对RESTAPI进行单元测试 我期望响应状态为CREATED,但我得到的却是一个PAGE NOT FOUND错误 以下是代码:- UserControllerUnitTests @SpringBootTest @ContextConfiguration(classes = { CommonConfig.class, SecurityConfig.class}) @RunWith(SpringRunner.class) class UserControllerUn
@SpringBootTest
@ContextConfiguration(classes = { CommonConfig.class, SecurityConfig.class})
@RunWith(SpringRunner.class)
class UserControllerUnitTests {
private static ObjectMapper mapper;
private static final String URI = "/users";
MockMvc mvc;
@Autowired
WebApplicationContext webAppContext;
@Mock
UserService userService;
MvcResult mvcResult;
@BeforeAll
static void setUp() {
mapper = new ObjectMapper();
}
@BeforeEach
void initialize() throws Exception {
mvc = MockMvcBuilders.webAppContextSetup(webAppContext).build();
....
....
....
void shouldReturnStatusCreatedIfValidUserPassedForPostUser(long index) throws Exception {
int expectedStatus = HttpStatus.CREATED.value();
UserDAO returnUser;
UserDAO user = userList.get(index);
userList.remove(index);
String jsonContent = mapper.writeValueAsString(user);
user.setId(index);
user.setEncryptedPassword(null);
Mockito.when(userService.addUser(Mockito.any())).thenReturn(user);
mvcResult = mvc.perform(MockMvcRequestBuilders.post(URI)
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.content(jsonContent)).andReturn();
//Mockito.verify(userService, Mockito.times(1)).addUser(Mockito.any());
int actualStatus = mvcResult.getResponse().getStatus();
Assert.assertEquals("Response status should be CREATED", expectedStatus, actualStatus);
jsonContent = mvcResult.getResponse().getContentAsString();
returnUser = mapper.readValue(jsonContent, UserDAO.class);
Assert.assertEquals("EncryptedPassword should not be returned", null,
returnUser.getEncryptedPassword());
}
@RestController
@RequestMapping("users/")
public class UserController {
UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
....
....
....
@PostMapping(path = "",
consumes = { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON },
produces = { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public ResponseEntity<UserDAO> createUser(@Valid @RequestBody UserDAO user) {
String password = user.getEncryptedPassword();
user.setEncryptedPassword(null);
UserDAO retreivedUser;
if(user.getId() != 0)
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
user.setEncryptedPassword(password);
retreivedUser = userService.addUser(user);
if(retreivedUser != null)
return new ResponseEntity<>(retreivedUser, HttpStatus.CREATED);
return new ResponseEntity<>(HttpStatus.CONFLICT);
}
}
用户控制器类
@SpringBootTest
@ContextConfiguration(classes = { CommonConfig.class, SecurityConfig.class})
@RunWith(SpringRunner.class)
class UserControllerUnitTests {
private static ObjectMapper mapper;
private static final String URI = "/users";
MockMvc mvc;
@Autowired
WebApplicationContext webAppContext;
@Mock
UserService userService;
MvcResult mvcResult;
@BeforeAll
static void setUp() {
mapper = new ObjectMapper();
}
@BeforeEach
void initialize() throws Exception {
mvc = MockMvcBuilders.webAppContextSetup(webAppContext).build();
....
....
....
void shouldReturnStatusCreatedIfValidUserPassedForPostUser(long index) throws Exception {
int expectedStatus = HttpStatus.CREATED.value();
UserDAO returnUser;
UserDAO user = userList.get(index);
userList.remove(index);
String jsonContent = mapper.writeValueAsString(user);
user.setId(index);
user.setEncryptedPassword(null);
Mockito.when(userService.addUser(Mockito.any())).thenReturn(user);
mvcResult = mvc.perform(MockMvcRequestBuilders.post(URI)
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.content(jsonContent)).andReturn();
//Mockito.verify(userService, Mockito.times(1)).addUser(Mockito.any());
int actualStatus = mvcResult.getResponse().getStatus();
Assert.assertEquals("Response status should be CREATED", expectedStatus, actualStatus);
jsonContent = mvcResult.getResponse().getContentAsString();
returnUser = mapper.readValue(jsonContent, UserDAO.class);
Assert.assertEquals("EncryptedPassword should not be returned", null,
returnUser.getEncryptedPassword());
}
@RestController
@RequestMapping("users/")
public class UserController {
UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
....
....
....
@PostMapping(path = "",
consumes = { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON },
produces = { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public ResponseEntity<UserDAO> createUser(@Valid @RequestBody UserDAO user) {
String password = user.getEncryptedPassword();
user.setEncryptedPassword(null);
UserDAO retreivedUser;
if(user.getId() != 0)
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
user.setEncryptedPassword(password);
retreivedUser = userService.addUser(user);
if(retreivedUser != null)
return new ResponseEntity<>(retreivedUser, HttpStatus.CREATED);
return new ResponseEntity<>(HttpStatus.CONFLICT);
}
}
@RestController
@请求映射(“用户/”)
公共类用户控制器{
用户服务用户服务;
@自动连线
公共用户控制器(用户服务用户服务){
this.userService=userService;
}
....
....
....
@后映射(路径=”,
使用={MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON},
products={MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
public ResponseEntity createUser(@Valid@RequestBody UserDAO user){
字符串密码=user.getEncryptedPassword();
user.setEncryptedPassword(null);
UserDAO retreivedUser;
if(user.getId()!=0)
返回新的响应属性(HttpStatus.BAD_请求);
user.setEncryptedPassword(密码);
retreivedUser=userService.addUser(用户);
if(retrieveduser!=null)
返回新的ResponseEntity(retreivedUser,HttpStatus.CREATED);
返回新的ResponseEntity(HttpStatus.CONFLICT);
}
}
完整的代码可以在中找到,我发现了一些错误:
@SpringBootTest
//@ContextConfiguration(class={CommonConfig.class,SecurityConfig.class})
@RunWith(SpringRunner.class)
类UserControllerUnitTests{
@RestController
@请求映射(“用户”)
公共类用户控制器{
@MockBean
用户服务用户服务;
谢谢你的帮助。我还包括了一个bootstrap.yml属性文件,用于测试/resources以禁用SpringCloudBus。