摘要:在對邏輯進行重構的時候可以直接通過單元測試能把控整個重構的邏輯不發生重大偏差,給后來者造福了。服務單元測試下面是一段獲取緩存邏輯的單元測試。
單元測試在開發的過程中可能會被很多的人所忽略,其實也不是真的被忽略可能是由于巨大的業務壓力而導致沒有時間去寫那些測試,而是直接通過集成測試完沒問題就提交給測試進行測試后上線了。這樣其實很多時候反而會浪費大量的時間在測試上面,而適量的寫好單元測試有以下一些優勢:
有單元測試可能會提高整個集成測試的進度而且最重要的是做到對自己寫的代碼知根知底,更有底氣的推到線上去。
在對邏輯進行重構的時候可以直接通過單元測試能把控整個重構的邏輯不發生重大偏差,給后來者造福了。
服務單元測試下面是一段獲取緩存邏輯的單元測試。CacheManager中封裝了邏輯從緩沖中取數據,如果數據沒有取到則從repositoryCache.loadStoreByKey(key)中load數據。
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")); }
mockrepositoryCache,當調用repositoryCache的loadStoreByKey或者getCacheName方法后返回測試數據。
后面執行CacheManager.getValueIfNullLoad中正常的業務邏輯。
最后判斷結果是否符合預期。
controller單元測試上面一小節只是針對普通的服務單元進行測試,但是遇到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 { Listusers = 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); } }
mock一個服務userService
InjectMocks userController后通過MockitoAnnotations.initMocks(this) 將userService這個mock的服務注入到userController中。
MockMvcBuilders.standaloneSetup(userController).build(); 創建MockMvc。
后面就是模擬發送http請求,然后驗證response的操作和上一節的類似。
最后是驗證mock服務的接口調用次數。
總結可能你也會在項目中看到很多的單元測試,但是隨著項目的迭代那些單元測試已經失效,又或者是你會看到在進行單元測試的時候會去啟動整個項目容器去做運行,不過只要有就是好的,后面在進行項目迭代的過程中別忘了把unit test寫上吧。
參考Unit Test Spring MVC Rest Service: MockMVC, JUnit, Mockito
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70489.html
摘要:輸出結果需要人工檢查的測試不是一個好的單元測試。為了有效的進行單元測試,需要遵循一定的方法,通常采用路徑覆蓋法設計單元測試用例。 在微服務架構下高覆蓋率的單元測試是保障代碼質量的第一道也是最重要的關口,應該持之以恒。 背景 單元測試為代碼質量保駕護航,是提高業務質量的最直接手段,實踐證明,非常多的缺陷完全可以通過單元測試來發現,測試金字塔提出者Martin Fowler 強調如果一個高...
摘要:原文作者鍵盤男單元測試是什么單元測試是針對程序的最小單元來進行正確性檢驗的測試工作。因此,首要任務,就是對單元測試全面了解。作為一名經驗豐富的程序員,寫單元測試更多的是對自己的代碼負責。 原文:http://www.jianshu.com/p/bc99678b1d6e作者:鍵盤男kkmike999 showImg(/img/bVCqyN); 單元測試是什么 單元測試 是針對 程序的最小...
摘要:單元測試框架作為的標準庫,是其他單元測試框架的基礎??梢院秃团浜鲜褂镁帉憜卧獪y試。官網地址單元測試覆蓋率工具單元測試中還需要用到代碼覆蓋率工具。代碼覆蓋率統計工具用來發現沒有被測試覆蓋的代碼,完善單元測試的覆蓋率。 在應用程序中,單元是具有一個或多個輸入和單個輸出的軟件中最小可測試部分。單元...
閱讀 3161·2023-04-25 19:09
閱讀 3875·2021-10-22 09:54
閱讀 1743·2021-09-29 09:35
閱讀 2904·2021-09-08 09:45
閱讀 2232·2021-09-06 15:00
閱讀 2766·2019-08-29 15:32
閱讀 1029·2019-08-28 18:30
閱讀 370·2019-08-26 13:43