【问题标题】:Cannot get Spring Boot to enable Caching无法让 Spring Boot 启用缓存
【发布时间】:2021-12-16 03:04:00
【问题描述】:

我正在关注网络上处理 Spring Boot 的默认缓存的众多教程之一。所以没有呃,榛子等,只是默认 spring-boot-starter-缓存 依赖。

@EnableCaching
@SpringBootApplication
public class myMainThing {}

@Service
public class ExportService{
//the service is autowired in a controller
@Cacheable(value="translations",
            key="{ #keyToTranslate, #lang }")
    public String translate(String keyToTranslate, String lang){

        try
        {
            Thread.sleep(2000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }

        ResourceBundle bundle = ResourceBundle.getBundle("messages", 
        Locale.forLanguageTag(lang));
        if (bundle == null) {
            return keyToTranslate;
        }
        for (String key : bundle.keySet()){
            String trimmedValue = key.substring(key.lastIndexOf(ExportUtils.DOT) + 1).trim();
            if (keyToTranslate.equals(trimmedValue)) {
                return bundle.getString(key);
            }
        }
        return keyToTranslate;
    }
}

@EnableCaching
public class ExportServiceTest{

@InjectMocks
    private ExportService myService;

@Test
    public void translateSuccess(){
        String value = myService.translate("KEY", "en");
        myService.translate("KEY", "en");
        myService.translate("KEY", "en");
   }
}

每次执行测试,总是需要 6 秒,所以我确定 translate 方法执行了 3 次,每次执行 2 秒,而不是第一次执行所需的 2 秒结果,然后关闭在接下来的两次调用中从缓存中获得相同的结果为零秒。

如果有人能发现我做错了什么,那将是莫大的安慰。

谢谢,

【问题讨论】:

  • 为什么会这样呢?你的测试没有使用spring来创建实例,那么spring特性应该如何应用到它上面。
  • 感谢您的信息,但我不确定我是否可以跟上。这听起来可能很愚蠢,但您所说的测试不使用弹簧是什么意思?测试类上的注释是 @RunWith(MockitoJUnitRunner.class) 和 @Import({ExportService.class}) 另外,我直接使用邮递员访问我的服务。没有测试类,当我使用翻译功能。
  • @Import 没用,因为您没有在测试中使用 Spring,而是在使用 Mockito。如果您希望它与 Spring 一起使用,请使用 spring 并将 @SpringBootTest 注释和 @Autowire 服务用于您的测试。
  • 非常感谢!你是对的,这个测试使用的是 mockito,我有另一套带有 @SpringBootTest(classes = { etc 的测试类。我理解你为什么说我没有使用 spring。一旦我把我的测试移到那里并自动连接服务我得到了两秒钟的结果。

标签: spring caching


【解决方案1】:

感谢 M. Deinum ,很明显这是一场虚惊。 测试类正在使用 Mockito。 一旦我使用 Spring 将测试移动到测试类,并自动连接服务,结果是两秒钟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-10
    • 2015-10-13
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    相关资源
    最近更新 更多