单元测试在开发的过程当中可能会被不少的人所忽略,其实也不是真的被忽略多是因为巨大的业务压力而致使没有时间去写那些测试,而是直接经过集成测试完没问题就提交给测试进行测试后上线了。这样其实不少时候反而会浪费大量的时间在测试上面,而适量的写好单元测试有如下一些优点:spring
下面是一段获取缓存逻辑的单元测试。CacheManager中封装了逻辑从缓冲中取数据,若是数据没有取到则从repositoryCache.loadStoreByKey(key)
中load数据。spring-mvc
public void getValueIfNullLoadTest() { /* 从repository里面取数据 */ RepositoryCache repositoryCache = mock(RepositoryCache.class); String key = anyString(); when(repositoryCache.loadStoreByKey(key)).thenReturn("test"); when(repositoryCache.getCacheName()).thenReturn(Constants.CACHE); CacheManager.addRepository(repositoryCache); String value = CacheManager.getValueIfNullLoad(Constants.CACHE, key, String.class); Assert.assertTrue(StringUtils.equals(value, "test")); /* 从缓存中取 */ value = CacheManager.getValueByCache(Constants.CACHE, key, String.class); Assert.assertTrue(StringUtils.equals(value, "test")); }
repositoryCache
,当调用repositoryCache
的loadStoreByKey或者getCacheName
方法后返回测试数据。CacheManager.getValueIfNullLoad
中正常的业务逻辑。上面一小节只是针对普通的服务单元进行测试,可是遇到http的接口测试就无能为力了,下面来介绍下若是写http接口的单元测试。缓存
public class UserControllerUnitTest { private MockMvc mockMvc; @Mock private UserService userService; @InjectMocks private UserController userController; @Before public void init(){ MockitoAnnotations.initMocks(this); mockMvc = MockMvcBuilders .standaloneSetup(userController) .addFilters(new CORSFilter()) .build(); } @Test public void test_get_all_success() throws Exception { List<User> users = Arrays.asList( new User(1, "Daenerys Targaryen"), new User(2, "John Snow")); when(userService.getAll()).thenReturn(users); mockMvc.perform(MockMvcRequestBuilders.get("/users")) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) .andExpect(mvcResult -> { String responseStr = mvcResult.getResponse().getContentAsString(); //针对结果进行验证。 }); Mockito.verify(userService, times(1)).getAll(); Mockito.verifyNoMoreInteractions(userService); } }
userService
userController
后经过MockitoAnnotations.initMocks(this)
将userService
这个mock的服务注入到userController
中。MockMvcBuilders.standaloneSetup(userController).build();
建立MockMvc
。可能你也会在项目中看到不少的单元测试,可是随着项目的迭代那些单元测试已经失效,又或者是你会看到在进行单元测试的时候会去启动整个项目容器去作运行,不过只要有就是好的,后面在进行项目迭代的过程当中别忘了把unit test写上吧。mvc
Unit Test Spring MVC Rest Service: MockMVC, JUnit, Mockito单元测试