0

I am using Spring Test to test my Spring Web MVC application, And I am trying do some validation.

this is my User entity

public class User {
    @NotNull // ensure it is not null
    @Size(min = 5, max = 10, message = "length of name should be 5 - 10")
    private String name;

    private Integer age;

    // ... getter 
    // ... setter
}

And this is my Controller


@RestController
@RequestMapping("/validation")
public class UserValidation {

    @RequestMapping("/user")
    public ResponseEntity nameNotNull(@Validated @RequestBody User user,
                                      BindingResult bindingResult){
        if (bindingResult.hasErrors()){
            return new ResponseEntity(HttpStatus.valueOf(400));
        }
        return new ResponseEntity(HttpStatus.valueOf(200));
    }
}

If I try to post a illegal params to this application, i will return 400 status correctly.

I post this from postman

{
    "name": "abc",
    "age": 333
}

It return 400 as my expected.

But problem is, I try to use mockTest

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration 
@ContextConfiguration({"classpath:applicationContext.xml"})
public class AutowiredTest  {
    @Autowired
    protected WebApplicationContext webApplicationContext;

    protected MockMvc mockMvc;

    @Before
    public void setup(){
        DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(webApplicationContext);
        mockMvc = builder.build();
    }
public class UserValidationTest extends AutowiredTest {

    @Test
    public void nameNotNull() throws Exception{
        User user = new User();
        user.setAge(18);
        user.setName("abc"); // illegal

        String userString = JSONObject.toJSONString(user);

        ResultMatcher msg = MockMvcResultMatchers.content()
                .json(userString);

        ResultMatcher is4xx = MockMvcResultMatchers.status().is4xxClientError();

        MockHttpServletRequestBuilder builder =
                MockMvcRequestBuilders.patch("/validation/user")
                        .contentType("application/json")
                        .content(userString);

        mockMvc.perform(builder)
                .andExpect(is4xx);
    }
}

But mocTest result is 200ok

java.lang.AssertionError: Range for response status value 200 
Expected :CLIENT_ERROR
Actual   :SUCCESSFUL

I don't konw what is the problem with my test. Are I write wrong test?

I have already write many test, they works fine except this one

Shuai Li
  • 2,426
  • 4
  • 24
  • 43

0 Answers0