首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么@Cachable(...)使用@Bean return mock(),但不要使用@MockedBean

在云计算领域中,@Cachable和@Bean是Spring框架中的注解,用于实现缓存和依赖注入的功能。@Cachable注解用于标记一个方法的返回值应该被缓存起来,以提高系统性能。而@Bean注解用于告诉Spring容器,某个方法的返回值应该被注册为一个Bean,以便在其他地方可以通过依赖注入的方式使用。

在给出答案之前,需要先了解一下@MockedBean注解。@MockedBean是一个自定义的注解,它的作用是模拟一个Bean对象,用于测试或者在开发过程中替代某个真实的Bean对象。通过使用@MockedBean注解,我们可以在测试环境中替换掉某个Bean对象,以便更好地控制测试的行为。

现在回到问题本身,为什么在使用@Cachable注解时要使用@Bean返回mock(),而不使用@MockedBean呢?

首先,@Cachable注解是用于缓存方法的返回值的,而不是用于替换某个Bean对象。它的作用是在方法被调用时,首先检查缓存中是否存在该方法的返回值,如果存在则直接返回缓存的结果,如果不存在则执行方法并将结果缓存起来。因此,@Cachable注解需要作用在方法上,而不是Bean对象上。

其次,@MockedBean注解是用于替换某个Bean对象的,它的作用是在测试环境中使用一个模拟的Bean对象来替代真实的Bean对象。在实际开发中,我们通常会使用@MockedBean注解来替换一些外部依赖,以便更好地控制测试的环境和结果。但是在使用@Cachable注解时,并不需要替换任何Bean对象,而只是对方法的返回值进行缓存处理。

综上所述,使用@Bean返回mock()而不使用@MockedBean是因为@Cachable注解的作用对象是方法的返回值,而不是Bean对象本身。使用@Bean返回mock()可以保证方法的返回值被正确地缓存起来,而不会影响其他Bean对象的正常使用。

关于@Cachable注解的更多信息和腾讯云相关产品推荐,可以参考以下链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

让你快速上手,从JUnit 4过渡到JUnit 5

该代码段将帮助您了解为什么2.0.3使用JUnit 4。 图像的右侧是spring-boot-test的最新版本。...在这里,您将创建一个主类和一个委托类,这对于学习mock的概念是必要的,因为mock的概念在任何商业项目中都是必不可少的,因为大多数项目在设计时都考虑了关注点分离。...本练习使用Spring作为IOC容器。创建的Java类将作为bean注入并自动装配。...带MockedBean注释的类中带注释的依赖项类(如Adder和Subtractor)。该批注将创建依赖项类的模拟实例,并将其注入JUnit运行期间的执行路径中。这是注入依赖性的最小侵入性的方法。...MockedBean的这种策略将使代码尽可能接近生产环境,并仍支持单元测试。 在此代码片段中,使用SpringJUnit4 ClassRunner运行测试。

2.5K10

JAVA实战:如何让单元测试覆盖率达到80%甚至以上

前言:看完上面的就知道什么时候或者为什么编写单元测试了。其他的我们不多说了,直接进入实战操作,这次使用的是springboot+Mockito框架,在最后会指出一些小技巧和bug。...需要注意的是,使用@Mock注解必须先使用Mockito.mock()初始化Mock对象。...在测试代码中,当需要匹配方法的参数但不关心具体的参数值时,可以使用Mockito.any()方法来匹配参数。...所以我们需要使用Mockito.any()去替代,让mock自己去模拟。以及thenReturn中返回的值符合业务逻辑才能保证业务能够走通。...后来查到可以使用映射测试模拟类,参考:ReflectionTestUtils.setField()方法接受三个参数:设置属性值的对象、属性名称和属性值。

3.5K30
  • Spring Boot 做单元测试,真心强悍!

    注解一起使用进行 Mock 测试。...NONE: 加载一个 ApplicationContext,但不会提供任何 Web Environment。 如果使用的 @SpringBootTest 注解不带任何参数,则默认为 Mock 环境。...UserService 变量上,表明这个userService实例在当前测试用例中是被 Mock 覆盖的,如果模拟的 Bean 有多个,则可以使用@Qualififier注解指定,然后通过Mockito...@MockBean、@SpyBean 注解既可作用于 Mock 环境,也可作用于真实环境,它只是用来模拟、替换环境中指定的 Bean 而已,但不能用于模拟在应用上下文刷新期间 Bean 的行为,因为在执行测试用例时应用上下文已经刷新完成了...,所以不可能再去模拟了,这种情况下建议使用 @Bean 方法来创建模拟配置。

    64530

    SpringBoot之Redis读写秘技

    除此之外,由于Redis 提供了 AOF以及RDB两种持久化机制,某些情况下也可以作为临时数据库使用。 本次将介绍 SpringBoot 中如何使用 Redis 进行缓存读写。 ?...序列化 同样,我们需要指定 JSON 作为 Key/HashKey/Value的主要方式: /** * 序列化定制 * * @return */ @Bean...true; } } 涉及到几个注解: 注解 说明 @Cachable 方法执行结果缓存 @CachePut 方法执行结果缓存(强制) @CacheEvict 方法执行时触发删除 @CachePut...与 @Cachable 的区别在于,前者一定会执行方法,并尝试刷新缓存(需条件满足), 而后者则是当缓存中不存在时才会执行方法并更新。...如果希望修改默认的行为,可以使用自定义的 KeyGenerator: /** * 定制方法缓存的key生成策略 * * @return */ @Bean

    97330

    如何写好单元测试:Mock脱离数据库+不使用@SpringBootTest「建议收藏」

    "/> 注意事项:   1、在使用@Autowired时,会先在IOC容器中查询自动引入的对应类型的bean 2、如果查询结果刚好为一个,就将该bean装配给@Autowired指定的属性值...解决方法:使用required=false 那么问题就来了,我们只是要写单元测试,为什么启动Spring呢?...5)注册一个TestRestTemplate或WebTestClient bean,用于在web测试中使用完全运行的web服务器。...) 现在一般写成这样 @SpringBootTest(classes = Application.class) 或者这样 @SpringBootTest 但不管写成怎样,这个注解都不该用 classes...的基础,Mock就是模拟一切操作数据库的步骤,不执行任何SQL,我们直接模拟这句操作数据库的代码执行时成功的,而且可以模拟任何返回值,主要有两个注解 @MockBean 只要是本地的,自己写的bean

    3.1K10

    Java的@Transactional事务回滚

    Exception e) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return...失效原因: 方法one方法two都是public的: classA中 ,任意调用classB的方法,是通过spring代理的方式,那么spring的注解才会生效 classA中,方法one...调用同class内的方法two,即this调用,spring注解不会生效(例如@Cachable,@Transaction) 解决方法 方案一:使用AspectJ代理 @Service public...需要一些额外的配置,但不能对所有的注解拦截都有效,这是因为这些注解不是用的AspectJ代理,如果是@Transactional事务注解的话, 则是生效的,具体细节翻源码了,这里不推荐使用。...AppicationContext来获得动态代理的bean,然后再执行你调用的方法 this.applicationContext.getBean(AsyncService.class)

    2.2K30

    Mockito入门:如何在Spring中Mock部分对象

    Mock服务可以依赖于一些框架来实现,最经典的就是Mockito。为什么最近专门来研究一下Mock对象的方法,是因为之前为了Mock下游服务直接修改了源代码中的实现。...MockitoAnnotations.initMocks(this) 这里给出了使用@Mock注解来Mock对象时的第一种实现,即使用MockitoAnnotations.initMocks(testClass...Mockito其实提供了一个非常方便的注解叫做@InjectMocks,该注解会自动把该单元测试中声明的Mock对象注入到该Bean中。...但是,如果不使用Spring的自动注入,则必须手动的将该类依赖的别的Bean注入进去。 因此目前使用Mockito的妥协方案是直接@Autowire该接口的实现。...Mock对象,而ReliedService会使用Spring Bean自动注入。

    10.9K20

    SpringBoot - 单元测试利器Mockito入门

    ---- Mock 测试 Mock 测试就是在测试过程中,创建一个假的对象,避免你为了测试一个方法,却要自行构建整个 Bean 的依赖链。...而当我们引入 Mock 测试时,就可以创建一个假的对象,替换掉真实的 Bean B 和 C,这样在调用B、C的方法时,实际上就会去调用这个假的 Mock 对象的方法,而我们就可以自己设定这个 Mock...mock userDao Bean 的方法,而不是真实的 userDao Bean。...对象使用方法,不过当使用 Mockito 在 Mock 对象时,有一些限制需要遵守: 不能 Mock 静态方法 不能 Mock private 方法 不能 Mock final class 因此在写代码时...,需要做良好的功能拆分,才能够使用 Mockito 的 Mock 技术,帮助我们降低测试时 Bean 的耦合度。

    15.9K42

    利用 Junt 维护代码质量

    UT达到我们的要求 说了这么多UT的难点,相信我们已知道写UT固然不是信手拈来的活,但为什么还要写,能为我们带来什么好处吗?...Mock测试减少状态规避外部依赖 针对外部环境的依赖,正常流程肯定是没办法测试的,但现在有针对UT的Mock框架,如与Junit结合使用的Powermock,可为我们排除外界干扰,db数据变了或联调的外界环境问题等都完全不是问题...我们明确我们测试的目标是LoginServiceImpl,因此我们要将依赖的外部接口Mock掉 public class LoginServiceImplMockTest{ /**...* 当前测试的类,使用InjectMocks注解 */ @InjectMocks private LoginServiceImpl loginService = new LoginServiceImpl...设置mock的接口 Mockito.when(userService.getUserByName(Mockito.anyString())).thenReturn(userDto);

    61210

    用过举手!SpringBoot 单元测试利器-Mockito

    mock 对象,替换掉 Spring 中已存在的那个真实的 userDao bean,也就是说,注入进 userService 的 userDao bean,已经被我们替换成假的 mock 对象了,所以当我们再次调用...userService 的方法时,会去调用的实际上是 mock userDao bean 的方法,而不是真实的 userDao bean 当我们创建了一个假的 userDao 后,我们需要为这个 mock...,改用 doThrow() 抛出 Exception Mockito.doThrow(new RuntimeException("mock throw exception")).when(userService...Mockito 的限制 上述就是 Mockito 的 mock 对象使用方法,不过当使用 Mockito 在 mock 对象时,有一些限制需要遵守 不能 mock 静态方法 不能 mock private...方法 不能 mock final class 因此在写代码时,需要做良好的功能拆分,才能够使用 Mockito 的 mock 技术,帮助我们降低测试时 bean 的耦合度 5.

    2.6K10

    单元测试经典三问:是什么,为什么,怎么做?

    2.2 为什么编写单元测试? 我们知道错误越早发现,越早解决,越好。 编写单元测试可以在编码阶段就可以验证代码的正确性,及早改正。...单元测试的三部曲: given -> when -> then 所谓 given 即构造参数和条件(如mock 依赖的bean ),所谓 when 执行目标方法; 所谓 then 即在给定的参数和条件下...()); } } 注:通常依赖的 Bean 的方法时, 继续使用插件一键生成单元测试代码: import org.junit.Test; import org.junit.runner.RunWith...如果需要 mock 私有方法、静态方法等请自行学习,可以使用 powmock 等工具。 我们还可以借助其他工具,自动生成测试的参数或者返回值。...《Java 单元测试生成测试字符串的神器:java-faker》 如果我们想要随机构造人名、地名、天气、学校、颜色、职业,甚至符合某正则表达式的字符串 三、总结 本文简单介绍单元测试是什么、为什么编写单元测试和如何编写单元测试

    1.1K30
    领券