Spring Boot控制器多类型请求体校验的高效单元测试方案咨询
高效测试Spring Boot控制器支持所有消息类型的方法
1. 参数化测试(JUnit 5)
这是最直接高效的方案,把所有MessageType的取值作为测试参数,编写一次测试逻辑即可自动遍历所有类型执行。
示例代码
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import java.util.stream.Stream; class ActivityControllerTest { // 提供所有消息类型的参数流 static Stream<String> messageTypes() { return Stream.of( MessageType.PLAIN, MessageType.ACTION, MessageType.NOTIFICATION // 新增类型时仅需在此添加对应常量 ); } @ParameterizedTest @MethodSource("messageTypes") void saveActivityTest_AllMessageTypes(String messageType) throws Exception { CimMessage cimMessage = new CimMessage(); cimMessage.setType(messageType); cimMessage.setContent("Dummy"); mockMvc.perform(post("/activities") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(cimMessage))) .andExpect(status().isOk()); } }
优势:新增消息类型时无需编写新测试方法,仅需维护参数列表,测试逻辑统一管理。
2. 反射自动获取常量(完全自动化)
如果MessageType接口中的常量较多,或者不想手动维护参数列表,可以用反射自动读取接口内所有String类型常量,实现完全自动化的测试覆盖。
示例代码
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import java.lang.reflect.Field; import java.util.stream.Stream; class ActivityControllerTest { static Stream<String> messageTypes() { return Stream.of(MessageType.class.getDeclaredFields()) .filter(field -> field.getType().equals(String.class)) .map(field -> { try { return (String) field.get(null); // 接口常量为静态,传入null即可获取 } catch (IllegalAccessException e) { throw new RuntimeException(e); } }); } @ParameterizedTest @MethodSource("messageTypes") void saveActivityTest_AllMessageTypes(String messageType) throws Exception { CimMessage cimMessage = new CimMessage(); cimMessage.setType(messageType); cimMessage.setContent("Dummy"); mockMvc.perform(post("/activities") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(cimMessage))) .andExpect(status().isOk()); } }
优势:新增MessageType常量时无需修改任何测试代码,测试会自动遍历所有符合条件的常量。若接口内有非String类型常量,可调整过滤条件适配。
3. 补充非法类型测试(可选)
除了覆盖合法类型,建议补充非法类型的测试场景,验证控制器的错误处理逻辑:
@Test void saveActivityTest_InvalidType() throws Exception { CimMessage cimMessage = new CimMessage(); cimMessage.setType("INVALID_TYPE"); cimMessage.setContent("Dummy"); mockMvc.perform(post("/activities") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(cimMessage))) .andExpect(status().isBadRequest()); // 根据实际错误处理逻辑调整预期状态码 }
内容的提问来源于stack exchange,提问作者N Ahmed
相关产品推荐
相关产品推荐

