SpringMVC 控制层的单元测试写法


IDEA快速创建单元测试

IDEA快速创建对应的单元测试:
选中类名—>idea快捷键—>ctrl+shift+t---->回车创建单元测试---->选中要测试的方法—>idea自动创建对应的包以及测试类

选中类名快捷键ctrl+shift+t
选中要测试的方法
自动创建测试方法

测试MVC

对MVC进行单元测试代码

@RunWith(SpringRunner.class)
//需要测试的Controller
@WebMvcTest(UserController.class)
public class UserControllerTest{
   
   

    @Autowired
    private MockMvc mvc;
    
    @MockBean
    UserService  uservice;

    @Test
    public void testMvc() throws Exception{
   
   
        int userId = 10;
        int expectCredit = 100;
                //模拟userService
        BDDMockito.given(this.userService.getCredit(userId)).willReturn(100);
                //MVC调用
        mvc.perform(MockMvcRequestBuilders.get("/user/{id}",userId))
            .andExpect(MockMvcResultMatchers.content().string
<think>好的,用户问的是如何将Spring MVC项目迁移到WebFlux,特别是上下文部分的改造方法。我需要结合之前的引用内容来回答这个问题。首先,用户提到的引用[2]和[3]提到Spring WebFlux和MVC的区别以及共存问题,这应该是关键点。引用[5]提到了迁移时MyBatis的自动配置,但WebFlux可能涉及不同的数据访问方式,比如Reactive编程。 用户需要具体的上下文改造步骤和示例。首先,我得回顾Spring MVC和WebFlux的配置差异。传统Spring MVC使用DispatcherServlet,配置在web.xml或者Java Config中,而WebFlux使用的是WebHandler,配置方式不同。例如,引用[4]中的servlet配置在迁移后可能不再适用,需要替换为WebFlux的配置方式。 然后,上下文配置方面,Spring MVC通常有spring-mvc.xml这样的配置文件,里面可能包含视图解析器、拦截器等。迁移到WebFlux后,这些可能需要用函数式编程模型或者注解驱动的配置来替代。比如,WebFlux使用@EnableWebFlux注解,而MVC用@EnableWebMvc。 另外,控制器层需要调整,MVC的Controller返回的是ModelAndView或者字符串,而WebFlux返回的是Mono或Flux类型。例如,引用[3]提到的Mono和Flux对象,说明需要将同步阻塞的代码改为响应式非阻塞的。 还要注意依赖的变化,比如需要引入spring-boot-starter-webflux而不是spring-boot-starter-web。同时,数据访问层如果之前用的是MyBatis,可能需要换成响应式的驱动,比如R2DBC,但引用[5]提到MyBatis有Spring Boot支持,但不确定是否兼容WebFlux,可能需要调整。 接下来,我需要整理步骤:配置调整、控制器改造、依赖管理、数据层适配。示例部分需要展示配置类的变化,比如用@Configuration配置WebFlux,以及控制器的响应式写法。同时,要指出需要注意的地方,比如WebMVC和WebFlux不能共存,避免配置冲突。 可能的问题点包括:静态资源的处理、拦截器转为WebFilter、视图技术的变化(如Thymeleaf Reactive)。需要提醒用户这些潜在的改造点,并给出示例代码片段,比如配置路由的方式,使用RouterFunctions定义端点。 最后,确保回答结构清晰,分步骤说明,每个步骤有示例代码或配置,并引用相关的引用内容作为支持,比如引用[3]提到的WebFlux和MVC不能共存的问题,需要在配置时注意。</think>### Spring MVC迁移至WebFlux的上下文改造方法 #### 一、核心上下文改造步骤 1. **依赖结构调整** 移除`spring-boot-starter-web`依赖,添加响应式核心依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> ``` 2. **配置类重构** - 替换`@EnableWebMvc`为`@EnableWebFlux` - 重写Web配置类: ```java @Configuration @EnableWebFlux public class WebConfig implements WebFluxConfigurer { // 配置视图解析器、编解码器等 @Override public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) { configurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder()); } } ``` 3. **Servlet API替换** 删除`web.xml`中DispatcherServlet配置[^4],改为基于`RouterFunction`的路由定义: ```java @Bean public RouterFunction<ServerResponse> routerFunction(HelloHandler handler) { return RouterFunctions.route() .GET("/api/hello", handler::hello) .POST("/api/users", handler::createUser) .build(); } ``` #### 二、控制器改造示例 **Spring MVC原代码**: ```java @RestController public class UserController { @GetMapping("/user/{id}") public User getUser(@PathVariable Long id) { return userService.findById(id); } } ``` **WebFlux改造后**: ```java @RestController public class UserController { @GetMapping("/user/{id}") public Mono<User> getUser(@PathVariable Long id) { return userService.findByIdReactive(id); } } ``` #### 三、关键差异处理 1. **线程模型变更** WebFlux基于事件循环模型(Netty默认),需确保所有阻塞操作(如JDBC)替换为响应式驱动(如R2DBC)[^3] 2. **会话管理迁移** 将`HttpSession`改为基于`WebSession`: ```java public Mono<ServerResponse> getSessionData(ServerRequest request) { return request.session() .flatMap(webSession -> { String data = webSession.getAttribute("key"); return ServerResponse.ok().bodyValue(data); }); } ``` 3. **拦截器改造** 将`HandlerInterceptor`改为`WebFilter`: ```java @Component public class AuthFilter implements WebFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { return exchange.getSession() .flatMap(session -> { if (!session.getAttribute("auth")) { return Mono.error(new AuthException()); } return chain.filter(exchange); }); } } ``` #### 四、验证与调试 1. 启动类需排除自动配置: ```java @SpringBootApplication(exclude = {WebMvcAutoConfiguration.class}) ``` 2. 使用`WebTestClient`进行测试: ```java @Test void testHelloEndpoint() { webTestClient.get().uri("/api/hello") .exchange() .expectStatus().isOk() .expectBody(String.class).isEqualTo("Hello WebFlux"); } ``` #### 五、注意事项 1. WebFlux与WebMVC**不能共存**[^3],需确保完全移除MVC依赖 2. 模板引擎需使用支持响应式的版本(如Thymeleaf Reactive) 3. 静态资源需通过`ResourceHandlerRegistry`配置: ```java @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/") .setUseLastModified(true); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值