gpt4 book ai didi

java - Spring Boot 1.4 单元测试 Hibernate Validation WebMvcTest

转载 作者:行者123 更新时间:2023-11-30 08:34:43 24 4
gpt4 key购买 nike

我正在尝试在 Spring Boot 1.4 中执行单元测试以测试我的验证是否在无效查询字符串参数上返回 400。

Controller

@RestController
@Validated
public class ExampleController {

...

@RequestMapping(value = "/example", method = GET)
public Response getExample(
@RequestParam(value = "userId", required = true) @Valid @Pattern(regexp = MY_REGEX) String segmentsRequest {

// Stuff here
}

}

异常处理器

@ControllerAdvice
@Component
public class GlobalExceptionHandler {

private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

// 400 - Bad Request
@ExceptionHandler(value = {ConstraintViolationException.class})
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void constrainViolationHandle(HttpServletRequest request, ConstraintViolationException exception) {
logger.error("Error Bad Request (400)");
}

}

上下文

@Bean
public Validator validator() {
final ValidatorFactory validatorFactory = Validation.byDefaultProvider()
.configure()
.parameterNameProvider(new ReflectionParameterNameProvider())
.buildValidatorFactory();
return validatorFactory.getValidator();
}

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
final MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setValidator(validator());
return methodValidationPostProcessor;
}

单元测试

@RunWith(SpringRunner.class)
@WebMvcTest(ExampleController.class)
public class ExampleControllerTest {

private static final String EMPTY = "";

@Autowired
private MockMvc mvc;

@Test
public void test() throws Exception {

// Perform Request
ResultActions response = this.mvc.perform(
get("/example").param("userId", "invalid")
);

// Assert Result
response.andExpect(status().isBadRequest())
.andExpect(content().string(EMPTY));
}

}

但是,当我运行测试时,我得到的是 200 而不是 400。当我作为应用程序而不是作为测试运行时,不会执行验证。

我相信这可能是因为它在执行测试时没有选择两个验证 bean?此验证有效

最佳答案

@WebMvcTest 您正在使用的注释是在所谓的独立 MockMvc 配置之上的 Spring Boot 包装器。此 MockMvc 功能测试没有任何其他 bean 的独立 Controller 。

为了能够测试更广泛的网络配置,您需要使用 web application setup :

@RunWith(SpringRunner.class)
@WebAppConfiguration
@ContextConfiguration("my-servlet-context.xml")
public class MyWebTests {

@Autowired
private WebApplicationContext wac;

private MockMvc mockMvc;

@Before
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}

// ...

}

但是请注意,这样的 Web 应用程序设置并不能解决所有问题。例如,您需要显式注册 Servler 过滤器或 Spring Security。但我认为应该包括验证。

关于java - Spring Boot 1.4 单元测试 Hibernate Validation WebMvcTest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38702561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com