问题:
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分享。没点深入的。。希望后面技术能更深入一点。