当前位置: 首页 > 知识库问答 >
问题:

模拟测试缓存

罗星洲
2023-03-14

我正在试着用mockito测试我的缓存层。

我用的是这里描述的咖啡因

基本上,我有这个...

@Service
class Catalog {

  @Autowired
  Db db;

  @Cachable
  public List<Item> getItems() {
    // fetch from db
    db.someDbMethod();
  }
}

@Configuration
@EnableCaching
class CatalogConfig {
  @Bean
  public CacheManager cacheManager() {
    return new CaffeineCacheManager();
  }
  @Bean
  public Db db() {
     return new Db();
  }
}
// properties as in documentation etc

这工作得很好,方法被缓存并且工作得很好。

public class CatalogTest {

     @Mock
     Db db;

     @InjectMocks
     Catalog catalog;

     // init etc

     @Test
     void cache() {
       catalog.getItems();
       catalog.getItems();
       verify(db, times(1)).someDbMethod(); // fails... expected 1 got 2
     }
     // Some other passing tests below
     @Test
     void getItems() {
       assertNotNull(catalog.getItems()); // passes
     }
}

共有1个答案

郝昊天
2023-03-14

我有这个案子。我通过部分bean的导入和SpringJUnit4ClassRunner来解决它:我将尝试编写主要思想:

@RunWith(SpringJUnit4ClassRunner.class)
@Import({CaffeineCacheManager.class, Catalog.class})
public class CatalogTest {

@MockBean
private Db db;

@Autowired
private CaffeineCacheManager cache;

@Autowired
private Catalog catalog;

@Test
void cacheTest(){
   when(db.someDbMethod()).thenReturn(....);

   catalog.getItems();
   catalog.getItems();

   verify(db, times(1)).someDbMethod();

   assertTrue(cache.get(SOME_KEY).isPresent());//if you want to check that cache contains your entity
}

}

您将有真正的缓存bean和一个机会来检查调用模拟Db的次数,还可以在测试中获得缓存键。

 类似资料:
  • 简介 在 Laravel 应用程序测试中,你可能希望「模拟」应用程序的某些功能的行为,从而避免该部分在测试中真正执行。例如:在控制器执行过程中会触发事件(Event),从而避免该事件在测试控制器时真正执行。这允许你在仅测试控制器 HTTP 响应的情况时,而不必担心触发事件。当然,你也可以在单独的测试中测试该事件逻辑。 Laravel 针对事件、任务和 Facades 的模拟,提供了开箱即用的辅助函

  • #使用Mocks测试 在现实世界的应用程序中,我们的组件很可能具有外部依赖性。当为组件编写单元测试时,如果我们可以模拟这些外部依赖性,以使我们的测试仅依赖于被测试组件的行为,这将是理想的。 vue-loader提供了一个特性,它允许你使用inject-loader向*.vue组件注入任意依赖项。一般的想法是,不是直接导入组件模块,我们使用inject-loader为该模块创建一个“模块工厂”函数。

  • 如何模拟集成测试所需的许多依赖关系? 我使用Mockito进行纯单元测试。在这种情况下,Pure意味着测试一个类,嘲笑它的所有依赖关系。漂亮。 现在是集成测试。假设在这种情况下,集成测试将测试以下内容: 消息被放入队列 我们也可以说,在第2步中发生的处理是严肃的事情。它依赖于大量的数据库交互、多种外部服务、文件系统,以及各种各样的东西。流还会引发很多副作用,所以我不能简单地确保响应是正确的——我需

  • 我用代码编写了以下旧方法,用于访问服务类中的请求对象,例如:

  • 本文向大家介绍android-studio 测试模拟器,包括了android-studio 测试模拟器的使用技巧和注意事项,需要的朋友参考一下 示例 如果没有特定需求,请选择x86_64带有Google API的系统映像来创建模拟器。 它的工作方式比armeabi-v7a基于Intel x86 x64的计算机快。 有一些使用ARM体系结构编译和设计的SDK库。 如果您尝试将它们安装在基于Intel

  • spring bean xml 有几个使用真实对象预先编写的测试用例。有没有办法我可以模拟这个类B,得到注入类A和模拟几个方法?我只想在我的测试用例中这样做,以便预先编写的测试用例不受影响?