You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在SpringBoot测试中使用MockMvc能否预期200或400状态码?

SpringBoot MockMvc 实现多状态码断言(200/400二选一)

默认的MockMvc状态匹配器不支持直接的「或」逻辑,但可以通过自定义ResultMatcher来实现同时断言响应状态码是200或400的需求,这样就能适配多环境,不用每次部署都修改测试代码。

实现步骤

  • 自定义静态工具方法,生成支持多状态码匹配的ResultMatcher
  • 在测试用例中替换原有冲突的状态断言逻辑

示例代码

首先添加自定义匹配工具:

import org.springframework.test.web.servlet.ResultMatcher;

public class CustomMatchers {
    public static ResultMatcher statusIsOneOf(int... allowedStatuses) {
        return result -> {
            int actualStatus = result.getResponse().getStatus();
            for (int status : allowedStatuses) {
                if (actualStatus == status) {
                    return;
                }
            }
            throw new AssertionError(String.format(
                "预期状态码为%s中的一个,但实际是%d",
                java.util.Arrays.toString(allowedStatuses),
                actualStatus
            ));
        };
    }
}

然后修改测试类:

@SpringBootTest
@AutoConfigureMockMvc
public class MyControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testGetResource() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/resource"))
                // 断言状态码是200或400
                .andExpect(CustomMatchers.statusIsOneOf(200, 400))
                // 保留排除404的需求
                .andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.status().isNotEqualTo(404));
    }
}

注意点

你原来的测试代码同时调用is2xxSuccessful()和isBadRequest()是逻辑矛盾的——200属于2xx成功状态,400是4xx客户端错误,这两个断言不可能同时通过,必须替换为「或」逻辑的自定义匹配器才能满足需求。

内容的提问来源于stack exchange,提问作者WARUTS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:08:12