我目前正在为使用MyBatis作为ORM的Spring Boot项目编写测试。
我正在使用MockMvc测试控制器层。
现在,当我做一个事务时,我自然会在测试中添加@Transactional,所以一切都会在测试后回滚。但是,验证更新的Service方法也有Spring @Transactional注释。
测试方法首先从对象映射器获取一个对象并进行更改。 接下来,我使用MockMvc调用相应的控制器更新路径,并添加更改对象的json作为内容。
控制器告诉服务进行更新。该服务所做的第一件事是从mapper获取具有该id的当前对象。这是问题发生的地方:它不是通过SELECT来获取对象,而是返回与测试中相同的引用。因此,我有两次相同的对象。这导致了一堆冗余,除了检查更改和更新另一个表的依赖项之外,它仍会更新大多数字段。 因此,我需要映射器从给定ID的数据库中获取当前对象,而不是在同一个@Transactional期间的先前调用的缓存版本。
有没有办法强迫这种情况发生(一个SELECT每个" getByPrimaryKey"等等,而不是缓存),或者让@Transactionals独立? 从测试中删除@Transactional时,它可以正常工作,因为它会执行另一个数据库请求。
修改:
默认情况下,MyBatis会在事务期间进行缓存。但是,这不应该被禁用,因此测试工作正常。由于在执行插入时刷新了缓存,更新或删除它可能在第一个getById之后进行更新。但是,这似乎不是最好的解决方案,imo。
是否可以选择禁用某个配置文件的缓存?