spring boot 单元测试
这里的单元测试指的是对webapi的测试,严格来说应该是集成测试,只不过用的是单元测试的方法。
通过使用MockMvcRequestBuilders模拟http的请求,访问controller:
具体方法如下:
@RunWith(SpringRunner.class) @SpringBootTest public class MedicareApplicationTests { @Autowired private WebApplicationContext wac; private MockMvc mvc; @Before public void setupMockMvc() { mvc = MockMvcBuilders.webAppContextSetup(wac).build(); } @Test public void getOpinionTaskHospitalsTest() throws Exception { mvc.perform(MockMvcRequestBuilders.post("/taskmgr/GetTasks") .contentType(MediaType.APPLICATION_JSON_UTF8) .header("token","eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJzdHJpbmcifQ.ylDXcyPnihJ1F1vUs8c3OnUwMxddotoJn6dXXNICphA") .accept(MediaType.APPLICATION_JSON_UTF8) .param("month","2015-07-01 00:00:00")) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.status").value(200)) .andDo(MockMvcResultHandlers.print()); } }
由于webapi采用的是jwt的认证方式 ,所以这里添加了tokein的header.
这里使用的是查询的操作,没有脏数据的问题,如果是插入和更新的操作,可以在方法上添加@Transactional注解,解决脏数据的问题。
如果只想针对controller层或service做单元测试,也是可以的,只需要mock service或dao层然后在方法中添加 when().then()。
如果采用mybatis数据层,可以采用@MybatisTest对数据层进行单元 测试。
添加gav
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter-test</artifactId> <version>1.3.2</version> </dependency>
如下mapper文件如下:
@Mapper public interface CityMapper { @Select("SELECT * FROM CITY WHERE state = #{state}") City findByState(@Param("state") String state); }
测试类如下:
@RunWith(SpringRunner.class) @MybatisTest public class CityMapperTest { @Autowired private CityMapper cityMapper; @Test public void findByStateTest() { City city = cityMapper.findByState("CA"); assertThat(city.getName()).isEqualTo("San Francisco"); assertThat(city.getState()).isEqualTo("CA"); assertThat(city.getCountry()).isEqualTo("US"); } }
参考:http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-test-autoconfigure/