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

Spring boot Rest:无法测试@RequestParam的验证

堵飞鸿
2023-03-14

我想用下面的类结构测试Spring boot API的控制器:

控制器:

@RestController
@RequestMapping("/member-management")
@Validated
public class MemberManagementController {

    private final MemberManagementService memberManagementService;

    public MemberManagementController(MemberManagementService memberManagementService) {
        this.memberManagementService = memberManagementService;
    }

    @GetMapping(value = "/view-member")
    public ResponseEntity<?> viewMember(
            @NotBlank(message = "username must not be blank!!") 
            @Size(max = 20, message = "maximum size of username id is 20!!") 
            @RequestParam("username") String username) {
        ...
    }
...
@ControllerAdvice
public class CustomRestExceptionHandler extends ResponseEntityExceptionHandler {
    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<Object> handleConstaintViolatoinException(final ConstraintViolationException ex) {
        List<String> details = new ArrayList<>();
        Set<ConstraintViolation<?>> violations = ex.getConstraintViolations();
        for (ConstraintViolation<?> violation : violations) {
            details.add(violation.getMessage());
        }
        ApiErrorResUtil error = new ApiErrorResUtil(String.valueOf(HttpStatus.BAD_REQUEST.value()),
                "Request param error", details);
        return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
    }
...
}

@RunWith(MockitoJUnitRunner.class)
public class MemberManagementControllerTest {

    @InjectMocks
    private MemberManagementController memberManagementController;

    @Mock
    private MemberManagementService memberManagementService;

    private MockMvc mockMvc;

    @Before // Execute before each test method
    public void setup() {
        this.mockMvc = MockMvcBuilders.standaloneSetup(memberManagementController)
                .setControllerAdvice(new CustomRestExceptionHandler()) // add ControllerAdvice to controller test
                .build();
    }

    @Test 
    public void viewMember_usernameSizeExceedsMaximumLimit() throws Exception {
        // Value from client
        String username = "a12345678901234567890"; // 21 characters

        MemberResDtoDataDummy memberResDtoDataDummy = new MemberResDtoDataDummy();

        when(memberManagementService.viewMember(username)).thenReturn(memberResDtoDataDummy.getMember1());

        mockMvc.perform(get("/member-management/view-member").param("username", username))
                .andExpect(status().isBadRequest()).andReturn();
    }

java.lang.AssertionError: Status expected:<400> but was:<200>
    at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59)
    ...

有谁能帮我解决这个问题,为什么预期状态是200而不是400,其他POST,PUT,PATCH,DELETE请求方法的测试和无效的param输入仍然正常工作:(

共有1个答案

西门凯康
2023-03-14

当您想在不需要启动服务器的情况下测试UI层时,必须将此测试定义为spring-boot测试,并使用MockMVC

@SpringBootTest@AutoConfiguRemockMVC

这个类注释将在没有服务器的情况下加载所有的applicationContext。

在这两种情况下,都必须autowiredmockMVC类型。

 类似资料:
  • 是否有一种方法可以在@RequestParams上进行spring控制器单元测试以进行javax验证。 我在控制器中有一个get方法,它用@size验证请求参数的大小。 有没有办法模拟jUnit测试大小验证器?我想验证大小为 样本测试: @RunWith(MockitoJUnitRunner.class)公共类MyControllerTest{ } 我也试过SpringRunner,但似乎还是失败

  • 有没有办法在类上不使用@RunWith(MockitoJUnitRunner)注释来模拟存储库? 我有一个测试通过了,没有注释,但是失败了。没有它,我的回购测试就不起作用。这是第二十二条军规。 当我使用这个注释时,我的测试中的当()方法不再是存根行为,模拟什么也不做,尽管设置了断点,那些断点被击中(表明行/方法正在运行),验证(...,次(x))语句说模拟对象从未与该方法相互作用。我一直在想为什么

  • 我正在使用带有React-Test-Library的jest来测试一个具有自定义prop-types验证器的组件。验证器如下所示: 我的测试看起来是这样的: 当呈现错误的时,验证器按预期工作。我在控制台中得到以下错误: 但在运行上述测试时,我在终端中得到这样的消息: 我错过了什么?

  • 当与应用程序相关的身份验证功能未正确实现时,它允许黑客利用其他用户凭据破坏密码或会话ID或利用其他实施缺陷。 下面我们借助简单的图表来了解这个漏洞的威胁代理,攻击向量,安全弱点,技术影响和业务影响。 威胁代理 - 匿名外部攻击者以及拥有自己帐户的用户可能会尝试从其他人那里窃取帐户。 攻击者的方法 - 在身份验证或会话管理功能中使用泄漏或漏洞。例如,公开的帐户密码,用于冒充用户的会话ID。 安全弱点

  • 我有一个rest控制器,它有简单的CRUD操作。我正在尝试编写集成测试。 下面是我的RestController: 我已经为RestController中的所有endpoint编写了集成测试 集成测试类:- 我的问题: 1.)当我把断点放在Rest控制器中时,它并没有停在那里,实际上它没有被调用。 2.)当我运行GET测试时,它会从响应返回登录html页面。getBody() 3.)当我运行POS

  • 我想验证请求参数。我已经浏览了很多博客并回答了问题,我也做了同样的事情。在控制器类上添加了@Validated。 控制器中的方法: 控制器建议 配置: 完成所有这些之后,现在我得到一个404错误。"状态":404,"错误":"未找到","消息":"没有可用的消息"