alibaba / jetcache

JetCache is a Java cache framework.
Apache License 2.0
4.96k stars 1.03k forks source link

在单元测试时,遇到无法更新缓存、删除缓存情况出现,想了解是什么原因? #892

Open zhengjiaao opened 1 month ago

zhengjiaao commented 1 month ago

yaml已配置 local、remote,代码示例:

public interface UserService {
   @Cached(name = "userCache-", key = "#userId", expire = 100)
    User getUserById(String userId);

    @CacheUpdate(name = "userCache-", key = "#user.userId", value = "#user")
    void updateUser(User user);

    @CacheInvalidate(name = "userCache-", key = "#userId")
    void deleteUser(String userId);
}

单元测试:

@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 支持 jupiter 测试方法按指定 @Order(1) 顺序执行
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    @Order(1)
    public void testGetUserById() {
        User user = userService.getUserById("111");
        System.out.println(user);
    }

    @Test
    @Order(2)
    public void testUpdateUser() {
        // 准备数据
        User user = new User(); // 创建要更新的用户对象
        user.setUserId("111");
        user.setName("李四");
        user.setAge(18);

        // 更新用户
        userService.updateUser(user);

        // 获取用户
        User user2 = userService.getUserById("111");
        System.out.println(user2);
    }

    @Test
    @Order(3)
    public void testDeleteUser() {
        // 准备数据
        String userId = "111";

        // 执行测试
        userService.deleteUser(userId);
    }
}

现象: 1、当运行整个UserServiceTest单元测试示例时,可以通过测试,能够正常写入redis缓存、修改redis缓存、删除redis缓存 2、当运行单个UserServiceTest中的某个方法的单元测试示例时,例如,先运行获取testGetUserById()(会写入redis缓存中),再运行testUpdateUser()(无法更新redis缓存),则运行失败,无法更新redis中缓存数据

更新or删除时报错信息:


Cache operation aborted because can't find cached definition

can't find cache definition with area=default name=userCache-, specified in public abstract void com.zja.cache.jetcache.service.UserService.updateUser(com.zja.cache.jetcache.model.User)
zhengjiaao commented 1 month ago

问题重点:当运行单个UserServiceTest中的某个方法的单元测试示例时,例如,先运行获取testGetUserById()(会写入redis缓存中),再运行testUpdateUser()(无法更新redis缓存),则运行失败,无法更新redis中缓存数据

areyouok commented 1 month ago

注解里面只有Cached会创建缓存实例,其它的CacheUpdate/CacheInvalidate只是根据name去找,你发的这个错误是没有找到。

我不确定你这里的原因是什么,你可以看看别的地方是否还有name = "userCache-"的定义。

zhengjiaao commented 1 month ago

@CacheUpdate(name = "userCache-", key = "#user.userId", value = "#user") void updateUser(User user);

觉得,是不是根据name查找的逻辑是内存数据,而不是远程redis中数据导致的?

zhengjiaao commented 1 month ago

情况是,分别运行testGetUserById()、testUpdateUser()两个方法,出现的问题,若是两个方法放一起执行则没有问题

areyouok commented 1 month ago

和redis没有关系,它是没有找到cache的配置定义

areyouok commented 1 month ago

这个和spring的初始化顺序有关,你有兴趣可以查查看