redisSession和mockSession
簡單談談
在我(wo)們進(jin)行開發(fa)過程中,單(dan)元(yuan)(yuan)測(ce)試(shi)是保證代碼(ma)質量的(de)最(zui)有利工具,我(wo)們每個(ge)方法(fa)都(dou)要(yao)(yao)有對應的(de)測(ce)試(shi),在目(mu)前開發(fa)規(gui)范中,主要(yao)(yao)把測(ce)試(shi)分為單(dan)元(yuan)(yuan)測(ce)試(shi)和集成測(ce)試(shi),我(wo)們的(de)公用方法(fa)都(dou)要(yao)(yao)寫(xie)(xie)自己的(de)單(dan)元(yuan)(yuan)測(ce)試(shi),而(er)web api的(de)每個(ge)接(jie)口都(dou)要(yao)(yao)寫(xie)(xie)集成測(ce)試(shi)。
redis session
分(fen)布式環境(jing)下(xia),單(dan)機的(de)(de)(de)(de)session是不能滿足我們需(xu)求的(de)(de)(de)(de),所(suo)以session存儲的(de)(de)(de)(de)中間件就出現了,比較常用的(de)(de)(de)(de)有(you)數據庫(ku)和redis兩種,在springboot框架里,也(ye)集成(cheng)了redis session的(de)(de)(de)(de)實現。
安裝依賴包
'org.springframework.session:spring-session-data-redis',
配置注入
/**
* Spring Session,代替了傳統的session.
*/
@Configuration
@EnableRedisHttpSession
public class HttpSessionConfig {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
/**
* redis 配置.
*/
@Bean
public RedisTemplate redisTemplate() {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
}
使用session
@Autowired HttpSession httpSession;
mockSession
在測試環(huan)境里,我們可(ke)以(yi)使用mockSession來實(shi)現對session的(de)模擬,在進行mvc請求(qiu)時,把session帶在請求(qiu)頭上(shang)就(jiu)可(ke)以(yi)了(le)。
MockHttpSession session;
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
* 初始化.
*/
@Before
public void init() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
session = new MockHttpSession();
session.setAttribute("distributor", DistributorBaseInfo.builder().id(1L).build());
}
@Test
public void testSession() throws Exception {
mockMvc
.perform(
get("/v1/api/user")
.accept(MediaType.APPLICATION_JSON_UTF8)
.session(session)
.param("pageCurrent", "1")
.param("pageSize", "1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.records.length()").value(1));
}
上面代(dai)碼中(zhong)展示了,如(ru)何(he)在單元測試中(zhong)模擬(ni)session,事實上,我們http請求里的session已經被mockSession覆蓋了,我們在對應的接口上打斷點可以看到,session使用的是mock出來的。