SpringWebMvctest-使用@Valid和自定义验证的测试请求机构



我正在尝试测试我的控制器端点,并用@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);
}

我的BalanceInquiryModel@Valid注释,并在后面有一些冬眠和自定义验证。这些验证都可以,并且已经进行了单位测试。

我喜欢测试的是我的终点,我在其中发送有效的JSON请求正文,期望有200响应,也是一个无效的JSON请求主体,期望通过SET @Valid实现验证的400响应。

例如,一个无效的呼叫是不发送Pinnumber或Length&lt;4。

我已经阅读了一些线程,有些则使用MockMvcBuilders.standaloneSetup()模拟完整控制器。但是我不会进行完整的集成测试。

不太确定如何继续这种情况,如果我应该继续。

P.S。:目前,无论验证是否会出现错误。

这里是更多代码和验证类/模型的要点。

这是我在项目上工作的一个示例之一希望它能帮助您:

我有一个全球异常处理程序来处理我的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);
    }

更新:

我认为您的主要问题是您正在使用 @webmvctest 代替 @springboottest

其中两个之间的不同是:

@webmvctest-用于测试控制器层。它不会在@RestController

旁边注入其他bean

因此,如果您只是在测试纯控制器即可看到您可以到达端池,那么您只需使用@webmvctest,这将使您的测试运行速度更快。

但是,在您的情况下,您希望它运行弹簧验证,您需要使用@springboottest

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

相关内容

  • 没有找到相关文章

最新更新