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 = "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这个方法。

坑点4:测试覆盖率报错,找到/bin目录下idea64.exe.vmoptions文件,在末尾添加-Djava.io.tmpdir=C:\Temp,注意目录是否存在。

坑点5:请保证包名一致。

你可能感兴趣的:(SpringBoot 2.X单元测试——Api篇(内附踩坑))