SpringWebMvcTest - 使用 @Valid 和自定义验证测试 Requestbody

2023-11-29

我正在尝试测试我的控制器端点和我的请求体注释@Valid注解。我的测试类如下所示:

@RunWith(SpringRunner.class)
@WebMvcTest(value = BalanceInquiryController.class, secure = false)
public class BalanceInquiryControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private BalanceInquiryController balanceInquiryController;

    @Test
    public void testGetBalanceInquiry() throws Exception {
        RequestBuilder requestBuilder = MockMvcRequestBuilders
                .post("/com/balanceInquiry")
                .accept(MediaType.APPLICATION_JSON)
                .content("{\"comGiftCard\":{\"cardNumber\":\"1234567890\",\"pinNumber\":\"0123\"},\"comMerchant\":\"MERCHANT1\"}")
                .contentType(MediaType.APPLICATION_JSON);

        MvcResult mvcResult = mockMvc.perform(requestBuilder).andReturn();
        MockHttpServletResponse response = mvcResult.getResponse();
        assertEquals(HttpStatus.OK.value(), response.getStatus());
    }
}

我的控制器 -@PostMapping看起来像这样:

@PostMapping(value = "/com/balanceInquiry")
public ResponseEntity<?> getBalanceInquiry(@Valid @RequestBody BalanceInquiryModel balanceInquiry, Errors errors) {
    if (errors.hasErrors()) {
        return new ResponseEntity<String>("Validation error", HttpStatus.BAD_REQUEST);
    }
    //do any stuff...
    return new ResponseEntity<BalanceInquiryResponse>(balanceInquiryResponse, HttpStatus.OK);
}

My BalanceInquiryModel注释为@Valid并且后面有一些休眠和自定义验证。这些验证都没有问题,并且已经进行了单元测试。

我喜欢测试的是我的端点,我在其中发送一个有效的 json 请求正文,期望得到 200 响应,并且还发送一个无效的 json 请求正文,期望得到由集合验证的 400 响应@Valid执行。

例如,无效调用是不发送长度

我读过一些主题和一些用途MockMvcBuilders.standaloneSetup()模拟完整的控制器。但我不会进行完整的集成测试。

不太确定如何继续这种情况以及我是否应该继续。

P.S.:目前,无论验证是否给出错误,我总是收到 200 响应。

这里有一个要点更多代码和验证类/模型。


这是我在项目中工作的一个例子 希望它能帮助你:

我有一个全局异常处理程序来处理我的 MethodArgumentNotValidException 并抛出它

@RequestMapping(value = "/add", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<User> createUser(@Valid @RequestBody User user) {

        User savedUser = userService.save(user);

        return new ResponseEntity<User>(savedUser, HttpStatus.CREATED);
    }


public void testAdduser() throws Exception{
        final User request = new User();
        request.setFirstName("Test");
        request.setLastName("some description");

        mockMvc.perform(post(END_POINT+"/add")
                .contentType(MediaType.APPLICATION_JSON)
                .content(stringify(request))

        ).andDo(print()).andExpect(status().isUnprocessableEntity())
        ;
    }
private String stringify(Object object) throws JsonProcessingException {
        return new ObjectMapper().writeValueAsString(object);
    }

Update:

我认为你的主要问题是你正在使用@WebMvcTest代替@SpringBootTest.

其中2个的不同之处在于:

@SpringBootTest注释将加载完整的应用程序并注入所有 bean,这可能会很慢。

@WebMvcTest - 用于测试控制器层。它不会在@RestController旁边注入其他bean

因此,如果您只是测试纯控制器以查看是否可以到达端点,那么您可以使用 @WebMvcTest 这将使您的测试运行得更快。

但在你的情况下,你希望它运行 spring 验证,你将需要使用 @SpringBootTest

详细:https://spring.io/guides/gs/testing-web/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringWebMvcTest - 使用 @Valid 和自定义验证测试 Requestbody 的相关文章

随机推荐