当前位置: 首页 > 知识库问答 >
问题:

@RequestParam javax验证junit REST控制器测试

佟阳云
2023-03-14

是否有一种方法可以在@RequestParams上进行spring控制器单元测试以进行javax验证。

我在控制器中有一个get方法,它用@size验证请求参数的大小。

@RequestMapping(value = "/getData", method = RequestMethod.GET)
    public ResultgetData(

            @Size(min=2, max=3)
             @RequestParam String number)

有没有办法模拟jUnit测试大小验证器?我想验证大小为

样本测试:

@RunWith(MockitoJUnitRunner.class)公共类MyControllerTest{

private MockMvc mockMvc;

@InjectMocks
private MyController myControllerMock;


@Before
public void initTest() {
    mockMvc = MockMvcBuilders.standaloneSetup(customerInsuranceControllerMock).setControllerAdvice(exceptionHandler).build();
}

@Test
public void getEmptyData() throws Exception{



    mockMvc.perform(MockMvcRequestBuilders.get(
        "/getData?number={number}"
        , "")
        .andExpect(MockMvcResultMatchers.status().isBadRequest());  // This is failing. It returns a success as javax @Size is not triggered.When a empty string is passed , it should be bad request

}

我也试过SpringRunner,但似乎还是失败了。

谢啦

共有2个答案

须原
2023-03-14

你有2个问题,1.您需要使用@L长度来验证String的长度,@size是验证集合中的项数量,例如List。如果你说它必须是2或3的int,那么你需要@Min(2)@Max(3)。2.您的控制器必须用@Valfy注释。

章涵蓄
2023-03-14

如果我正确理解您的问题,您可以将@RunForSpringRunner@WebMvcTest一起用于您的控制器和异常处理程序类。

由于您的问题没有显示控制器的外观,请考虑以下控制器,返回给定名称的问候语:

@Data
public class Greeting {
    private String content;
}
@Validated
@RestController
public class GreetingController {

    @GetMapping(path = "/greeting", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Greeting> getGreeting(
                @RequestParam @Size(min = 2, max = 10) String name) {

        Greeting greeting = new Greeting();
        greeting.setContent("Hello " + name + "!");

        return ResponseEntity.ok(greeting);
    }
}

现在让我们考虑一个异常处理程序,用于“代码>强制Tebug”异常>代码>,当一些验证失败时,它将被抛出:

@Data
public class ApiError {
    private String message;
    private HttpStatus status;
    private Object details;
}
@Data
public class InvalidValue {
    private String name;
    private Object value;
    private String message;
}
@ControllerAdvice
public class WebApiExceptionHandler {

    @ExceptionHandler({ConstraintViolationException.class})
    public ResponseEntity<Object> handleConstraintViolation(ConstraintViolationException ex,
                                                            WebRequest request) {

        List<InvalidValue> invalidValues = ex.getConstraintViolations()
                .stream()
                .map(this::toInvalidValue)
                .collect(toList());

        ApiError apiError = new ApiError();
        apiError.setMessage("Validation error");
        apiError.setStatus(HttpStatus.BAD_REQUEST);
        apiError.setDetails(invalidValues);

        return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
    }

    private InvalidValue toInvalidValue(ConstraintViolation violation) {
        InvalidValue invalidValue = new InvalidValue();
        invalidValue.setName(violation.getPropertyPath().toString());
        invalidValue.setValue(violation.getInvalidValue());
        invalidValue.setMessage(violation.getMessage());
        return invalidValue;
    }
}

有了这个,您可以编写如下所示的测试和期望:

@RunWith(SpringRunner.class)
@WebMvcTest({GreetingController.class, WebApiExceptionHandler.class})
public class GreetingControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    @SneakyThrows
    public void getGreeting_shouldReturn200_whenNameIsValid() {

        mockMvc.perform(
                get("/greeting")
                        .param("name", "foo")
                        .accept(MediaType.APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))

                .andExpect(jsonPath("$.*", hasSize(1)))
                .andExpect(jsonPath("$.content").value("Hello foo!"));
    }

    @Test
    @SneakyThrows
    public void getGreeting_shouldReturn400_whenNameIsInvalid() {

        mockMvc.perform(get("/greeting").param("name", "_"))
                .andDo(print())
                .andExpect(status().isBadRequest())
                .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))

                .andExpect(jsonPath("$.*", hasSize(3)))
                .andExpect(jsonPath("$.message").value("Validation error"))
                .andExpect(jsonPath("$.status").value("BAD_REQUEST"))
                .andExpect(jsonPath("$.details", hasSize(1)))

                .andExpect(jsonPath("$.details[0].*", hasSize(3)))
                .andExpect(jsonPath("$.details[0].name", is("getGreeting.name")))
                .andExpect(jsonPath("$.details[0].value", is("_")))
                .andExpect(jsonPath("$.details[0].message", is("size must be between 2 and 10")));
    }
}
 类似资料:
  • 我想验证请求参数。我已经浏览了很多博客并回答了问题,我也做了同样的事情。在控制器类上添加了@Validated。 控制器中的方法: 控制器建议 配置: 完成所有这些之后,现在我得到一个404错误。"状态":404,"错误":"未找到","消息":"没有可用的消息"

  • 我们正在尝试做一些具有登录屏幕的网站。但是我们有一个问题。我们的域是本地主机/登录/用户。但是,如果用户进入localhost/Home/Index,他/她无需登录即可访问我们的主站点。因此,我们将 [授权] 写入索引控制器。但我不知道我必须使用什么。我是否必须在我们的项目中使用AuthorizeAttribute? 如何访问LoginController/Authentication函数中的索引

  • 英文原文:http://emberjs.com/guides/testing/testing-controllers/ 单元测试方案和计算属性与之前单元测试基础中说明的相同,因为Ember.Controller集成自Ember.Object。 针对控制器的单元测试使用ember-qunit框架的moduleFor来做使这一切变得非常简单。 测试控制器操作 下面给出一个PostsController

  • 环境:Mac OS X Lion, PHP 5.3.10, MySQL 5.X,TYPO3 4.7.1,Extbase 4.7.1,流体4.7.0 几天来,我一直在纠结extbase中的一个奇怪的验证错误。 Tx_Foo_Controller_FeUserController包含以下两个操作: 和 两项行动的内容: 登记册。html具有以下形式: createAction中只有一些“OK”文本。

  • 我试图在带有@valid注释的Spring REST控制器中使用Hibernate验证。 但验证没有发生。 下面是Maven构建必须要说的话: java.lang.AssertionError:状态应为:<400>,但实际为:<201> 注意AdminNotFoundException是由其他测试触发的。 但不触发MethodArgumentNotValidException。 下面是contro

  • 我知道有一个有效的注释,它指示spring根据JSR-303验证一个控制器参数,在这个示例中: 但我希望能够以某种方式配置Spring,以便在所有控制器中启用验证,而无需明确指定有效的注释。 这有可能吗?一些Spring配置?利用AOP?。。。