如何模拟Spring bean的特定方法

时间:2019-02-22 19:54:20

标签: spring junit mockito

我有一个带有多个API的spring bean。模拟Bean不能达到我的目的,因为我想验证对具有相同输入的多次getCachedData()调用仅一次调用过的fetchFromDb()。这是为了确保结果被缓存。

调用getCachedData()时是否可以在bean“市场”上模拟fetchFromDb()?

样品分类

@Configuration("market")
public class AllMarket {

@Autowired
private CacheManager cachedData;

public boolean getCachedData(LocalDate giveDate) {
   //check if it exists in cache
   if(Objects.nonNull(checkCache(giveDate)) {
      return checkCache(giveDate);
   }
   //fetch from database
   boolean bool = fetchFromDb(givenDate);
   cacheData(giveDate, bool);
   return bool;
}
public boolean checkCache(LocalDate giveDate) {
   return cacheManager.getData(givenDate); 
}
public boolean fetchFromDb(LocalDate givenDate) {
  //return the data from database
} 
public void cacheData(LocalDate givenDate, boolean bool) {
   cacheManager.addToCache(givenDate, bool);
}

}

2 个答案:

答案 0 :(得分:2)

您可以使用Mockito.spy()进行这种测试。在这种情况下,您应该监视AllMarket实例并存根fetchFromDb。最后,您可以Mockito.verifyfetchFromDb调用一次。看起来像这样:

AllMarket spy = spy(allMarket);
when(spy.fetchFromDb(givenDate)).thenReturn(true); //you have boolean as a return type
...
verify(spy, times(1)).fetchFromDb(givenDate);

有关更多信息,您可以查看Official Mockito doc

答案 1 :(得分:0)

也许mimito参数捕获者可以帮助您。它使您可以捕获方法输入以及调用方法的次数以及其他功能。请检查https://www.baeldung.com/mockito-annotations