如何在Spring启动应用程序

时间:2018-01-18 05:36:47

标签: spring spring-boot junit mockito spring-boot-test

我的控制器定义如下

 @GetMapping(value="")
public ResponseEntity<JsonResponse> getLocations(@RequestHeader(value="id") String id, @LocationType @RequestParam(value="locationType" ) String P_STS_AREA_TYP) {

    ...
    return new ResponseEntity<>(response,HttpStatus.OK);
}

@LocationType是自定义注释,定义

@Target({ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = LocationTypeValidator.class)
public @interface LocationType {
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};

}

它运行正常,在应用正常运行时检查位置类型。但是当我尝试使用Juint进行测试时,它会停止工作。

@Test
public void should_return_input_invalid_exception_for_invalid_location_type_for_get_location_endpoint() throws Exception {
    mockMvc.perform(get("/something/something/something")
            .param("locationType", "something")
            .header("id", "12345678"))
            .andExpect(status().isBadRequest());

}

它通过验证并且不会像应用程序正常运行时使用相同的位置类型查询参数那样输入错误处理逻辑。

在测试类上使用的注释

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { something.class, something.class})

mockito as mock framework

有人知道如何在Junit中进行自定义注释工作吗?

@Plog,我的验证器定义

public class LocationTypeValidator implements ConstraintValidator<LocationType, String> {

@Autowired
InputValidator inputValidator;
@Override
public void initialize(LocationType locationType) {

}

@Override
public boolean isValid(String locationType, ConstraintValidatorContext constraintValidatorContext) {
    return inputValidator.validateLocationType(locationType);
}

}

我无法设置Validator,因为它没有实现Validator接口

1 个答案:

答案 0 :(得分:0)

您需要为mockMvc实例提供自定义验证器。你应该可以通过自动装配Spring的LocalValidatorFactoryBean

来做到这一点
@Autowired
private LocalValidatorFactoryBean validator;

...

@Before
public void setUp() {
    mockMvc = MockMvcBuilders.standaloneSetup(myController)
                  .setValidator(validator).build()
}