Springboot controller service 单元测试 Error creating bean

本文讲述了在Springboot项目中遇到Controller单元测试时出现`Error creating bean`的问题及原因。问题源于Controller是否引用了Service。提供两种测试写法:1. 不引用Service的Controller测试;2. 使用`@Autowired`引用Service的Controller测试,并提及`@WebAppContextSetup`和`@SpringBootTest`注解的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

spring boot项目进行单元测试时,照着网上教程测试自己的controller一直失败找了一上午没找到原因。下午终于成功了。

原因

教程的controller都不带service引用,和带service引用的controller测试方法有一点区别。

 

写法1:不带service引用的 controller单元测试: 

ConController 为需要测试的 controller,里面所有方法都不带 service引用。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ConController.class)
@WebAppConfiguration
public class ConControllerTest {
    @Autowired
    private WebApplicationContext webApplicationContext;
    private MockMvc mockMvc;

    
    @Before
    public void setup() throws Exception{
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
    
    
    @Test
    public void test() throws Exception{
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/testpost")
                .header("token","ab15acd61c")
        ).andDo(MockMvcResultHandlers.print()).andReturn();
        System.out.println("------end----");
    }
    
}

 

写法2:@Autowired 引用了service的Controller单元测试

SpringbootApplication 是此spring boot项目的启动类

CommonController 为需要测试的 controller,里面正常带有 service引用。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootApplication.class)//区别
@WebAppConfiguration
public class CommonControllerTest1 {
    @Autowired
    private WebApplicationContext webApplicationContext;
    private MockMvc mockMvc;
    
    @Autowired
    private CommonController commonController;//区别
    
    @Before
    public void setup() throws Exception{
//        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        mockMvc = MockMvcBuilders.standaloneSetup(commonController).build();//区别
    }
    
    
    @Test
    public void test() throws Exception{
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/testpost")
                .header("token","ab15acd61")
        ).andDo(MockMvcResultHandlers.print()).andReturn();
        System.out.println("------end----");
    }

 

第二种写法也可以兼容不带service的controller测试。但是应该是启动了整个项目慢一点。

还有就是

MockMvcBuilders.webAppContextSetup

MockMvcBuilders.standaloneSetup 

的区别,

简单看了下 webAppContextSetup测的是已经完全初始化的,standaloneSetup相应的可以测这种需要依赖注入的。

目前发现是这样,再深入就没了

 

---------------------------------------------------------------------------------------------------------

 

 

好尴尬,时隔几年了还在写小bug分享。没点深入的。。希望后面技术能更深入一点。

 

  1.  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值