Spring boot 如何在Spring启动测试中模拟BindingResult

Spring boot 如何在Spring启动测试中模拟BindingResult,spring-boot,mockito,spring-test,spring-test-mvc,Spring Boot,Mockito,Spring Test,Spring Test Mvc,我有以下控制器: @RestController @请求映射(值=根映射) 公共类网关控制器{ @自动连线 私有请求验证器请求验证器; @InitBinder 受保护的活页夹(WebDataBinder活页夹){ binder.addvalidator(requestValidator); } @后期映射(值=重定向映射) 公共响应重定向端点(@Validated@RequestBody RequestDTO RequestDTO,BindingResult){ if(result.hasErr

我有以下控制器:

@RestController
@请求映射(值=根映射)
公共类网关控制器{
@自动连线
私有请求验证器请求验证器;
@InitBinder
受保护的活页夹(WebDataBinder活页夹){
binder.addvalidator(requestValidator);
}
@后期映射(值=重定向映射)
公共响应重定向端点(@Validated@RequestBody RequestDTO RequestDTO,BindingResult){
if(result.hasErrors()){
//处理验证错误
返回ResponseEntity.status(HttpStatus.BAD_请求).build();
}
//做其他事情
返回ResponseEntity.status(HttpStatus.OK).build();
}
}
这个测试班:

@RunWith(SpringRunner.class)
@WebMvcTest(GatewayController.class)
公共类网关控制器测试{
@自动连线
私有MockMvc-MockMvc;
@蚕豆
私有请求验证器请求验证器;
@蚕豆
私有BindingResult-BindingResult;
私人杰克逊特请求杰克逊特;
@以前
public void setUp()引发异常{
initFields(这是新的ObjectMapper());
Mockito.when(requestValidator.supports(ArgumentMatchers.any())。然后返回(true);
}
@试验
public void WhenDirectWithValidationErrorsThenBadRequestReturned()引发异常{
RequestDTO request=新RequestDTO();
//设定一些值
Mockito.when(bindingResult.hasErrors())。然后返回(true);
mockMvc.perform(MockMvcRequestBuilders.post(根映射+重定向映射)
.contentType(MediaType.APPLICATION_JSON)
.content(requestJacksonTester.write(request.getJson()))
.andExpect(MockMvcResultMatchers.status().isBadRequest());
}
}
当我运行此代码时,测试用例失败的原因如下:Status 预计:400 实际:200

因此,我要做的是模拟
BindingResult
,它作为参数传递给控制器中的
redirectEndpoint
方法,以便在调用
BindingResult.hasErrors()
时,应该返回true,测试用例通过

我找了很多次,但都没找到。有什么建议吗


提前感谢。

BindingResult
不是
应用程序上下文中的bean。因此,您不能通过
@MockBean
模拟它

Spring MVC为每个传入的HTTP请求创建一个
BindingResult

因此,您不想模拟
BindingResult
。事实上,您可能也不想模仿
RequestValidator
的行为。相反,您最好使用
RequestValidator
的实际实现,传入无效的请求数据(通过
MockMvc
),然后相应地验证响应


请注意,您应该能够通过
@Import(RequestValidator.class)
在测试类中包含
RequestValidator
的真正实现。

非常感谢@sam brannen,这解决了我的问题。是的,你是对的,我应该使用
RequestValidator
的真正实现。我删除了
requestValidator
bindingResult
,然后添加了
@Import(requestValidator.class)
,一切正常。