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