SpringBoot|SpringBoot 2.X单元测试——Api篇(内附踩坑)
先上代码:
@SpringBootTest(classes = CrmBackendApplication.class)
@ActiveProfiles("dev")
@RunWith(SpringRunner.class)
public class CustControllerTest {private MockMvc mockMvc;
@Autowired
private CustController custController;
@Before
public void setup() {
mockMvc = MockMvcBuilders.standaloneSetup(custController).build();
}@Test
@WithUserDetails(value = "https://www.it610.com/article/san.zhang", userDetailsServiceBeanName = "jwtUserDetailsService")
public void test() throws Exception {
MvcResult mvcResult = mockMvc.perform(post("/cust/search").contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON).content("{\n" +
"\t\"pageSize\":100,\n" +
"\t\"content\":\"测试1462\",\n" +
"\t\"queryType\":\"cust_queryType_custName\"\n" +
"}")).andReturn();
Assert.assertEquals(200, mvcResult.getResponse().getStatus());
}
}
坑点1:由于yml配置文件区分dev、uat和prod环境,因为是在本地,故而添加@ActiveProfiles注释指定dev环境,后台会映射到application-dev.yml配置文件。
坑点2:控制类custController通过@Autowired自动注入进来,以此构建mockMvc对象。原本学的别人直接new一个,后来发现里面依赖的各service类都是null,这才注意到依赖注入的问题。
坑点3:因为项目里使用Spring Security,所以会出现权限拦截的问题,因此使用@WithUserDetails注解解决。其中value表示你登录的用户名,userDetailsServiceBeanName指定了你的UserDetailsService实现类,例如我使用JwtUserDetailsService实现了UserDetailsService,它的beanName是jwtUserDetailsService,它有一个必须实现的方法loadUserByUsername(String username),其中的参数“username”当然就是你刚刚添加的value值了,在执行测试方法时,后台会自行调用loadUserByUsername这个方法。
【SpringBoot|SpringBoot 2.X单元测试——Api篇(内附踩坑)】坑点4:测试覆盖率报错,找到/bin目录下idea64.exe.vmoptions文件,在末尾添加-Djava.io.tmpdir=C:\Temp,注意目录是否存在。
坑点5:请保证包名一致。
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- springboot使用redis缓存
- 20180322【w4复盘日志】
- springboot整合数据库连接池-->druid
- 没有复用的cell|没有复用的cell 单元格的写法
- SpringBoot中YAML语法及几个注意点说明
- springboot结合redis实现搜索栏热搜功能及文字过滤
- springboot中.yml文件的值无法读取的问题及解决