亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何等待 Redis 緩存緩存信息

如何等待 Redis 緩存緩存信息

慕森王 2022-09-01 16:47:05
我正在使用spring-data-redis,并試圖有一個可以測試我的緩存邏輯的junit。測試用例偶爾會工作。我猜如果緩存邏輯在調用第二個方法調用之前完成,那么它就可以工作了,否則它就會失敗。如果有些人遇到過類似的問題,我想了解他們是如何做到這一點的。截至目前,我正在使用thread.sleep(),但正在尋找替代方案。  @Test  public void getUserById() {  User user = new User("name", "1234");when(userRepository.findbyId("1234")).thenReturn(Optional.ofNullable(user));  // first method call  User user1 = userService.findbyId("1234");  assertThat(user.getName()).isEqualTo(user1.getName());  assertThat(user.getId).isEqualTo(user1.getId());  // sleeping the thread so to provide caching aspect sufficient time   // to cache the information  try {    Thread.sleep(1000);  } catch (InterruptedException e) {    e.printStackTrace();  }  // second method call, expecting cache to work.  userCache = userService.findbyId("1234");  verify(userRepository, never()).findbyId("1234");  assertThat(user.getName()).isEqualTo(userCache.getName());  assertThat(user.getId).isEqualTo(userCache.getId());}
查看完整描述

2 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

等待時間較短的運行時問題在分布式系統中非常普遍。為了解決等待測試斷言太久的需要,有一個名為Waitility的小工具。

有了這個,你基本上可以通過在特定的時間間隔內多次查詢斷言來做更聰明的等待,直到達到給定的超時(...以及更多)。

關于您的示例,請嘗試以下操作:

        Awaitility.await()
                .pollInterval(new Duration(1, TimeUnit.SECONDS))
                .atMost(new Duration(10, TimeUnit.SECONDS))
                .untilAsserted(() -> 
                    User user1 = userService.findbyId("1234");
                    assertThat(user1.getName()).isEqualTo(user.getName());

關于問題的另一部分,在集成測試中,您實際上可以對實例執行某種預熱,或者如果您有容器化集成測試(例如Docker),則可以對其發出一些第一個請求,或者在開始測試之前等待某個條件Redis


查看完整回答
反對 回復 2022-09-01
?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

實際問題不在于線程等待時間。要使 Redis 緩存正常工作,需要跨越一個單獨的線程。對于我的服務測試,我通過一個單獨的測試用例對其進行了測試。


 @Test

 public void getUserById() {

   User user = new User("name", "1234");

   when(userRepository.findbyId("1234")).thenReturn(Optional.ofNullable(user));

    // first method call

   User user1 = userService.findbyId("1234");

   assertThat(user.getName()).isEqualTo(user1.getName());

   assertThat(user.getId).isEqualTo(user1.getId());

 }

 //ensure this test case is executed after getUserById. I used 

 //@FixMethodOrder(MethodSorters.NAME_ASCENDING)

 @Test

 public void getUserById_cache() {

   User user1 = userService.findbyId("1234");

   Mockito.verify(userRepository, never()).findbyId("1234")

   assertThat(user.getName()).isEqualTo(user1.getName());

   assertThat(user.getId).isEqualTo(user1.getId());

 }


查看完整回答
反對 回復 2022-09-01
  • 2 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號