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:请保证包名一致。

    推荐阅读