【发布时间】: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。一旦我把我的测试移到那里并自动连接服务我得到了两秒钟的结果。