Spring boot MockMvc响应返回404,预期响应201

Spring 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

我不熟悉在Spring Boot中对RESTAPI进行单元测试

我期望响应状态为CREATED,但我得到的却是一个PAGE NOT FOUND错误

以下是代码:-

UserControllerUnitTests

@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);
}
}

完整的代码可以在

中找到,我发现了一些错误:

  • 摆脱ContextConfiguration

    @SpringBootTest
    //@ContextConfiguration(class={CommonConfig.class,SecurityConfig.class})
    @RunWith(SpringRunner.class)
    类UserControllerUnitTests{
    
  • 在控制器上指定正确的映射(无斜杠)

    @RestController
    @请求映射(“用户”)
    公共类用户控制器{
    
  • 您设置了测试中未使用的UserService mock。您是指@MockBean吗

    @MockBean
    用户服务用户服务;
    

  • 谢谢你的帮助。我还包括了一个bootstrap.yml属性文件,用于测试/resources以禁用SpringCloudBus。