首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何用Spring + Spring数据JPA进行单元测试悲观锁定

如何用Spring + Spring数据JPA进行单元测试悲观锁定
EN

Stack Overflow用户
提问于 2017-08-02 23:21:56
回答 2查看 3.8K关注 0票数 9

我想测试FooRepository.lock()是否工作,在有人调用lock()之后,其他人调用它应该等待。

以下是我最好的尝试,它不起作用。我相信原因是entityMangerfooRepository都参与了相同的交易。

如何从另一个事务调用lock()?或者对悲观锁的单元测试有什么建议?谢谢!!

FooRepositoryTest:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.demo;

import java.util.UUID;

import javax.persistence.LockModeType;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@DataJpaTest
public class FooRepositoryTest {

    @Autowired
    private TestEntityManager entityManager;    

    @Autowired
    private FooRepository fooRepository;

    @Test
    public void lockTest() {
        // given
        Foo foo = new Foo();
        foo.setName("foo-name");

        UUID fooId = fooRepository.save(foo).getFooId();
        entityManager.flush();
        entityManager.clear();

        // when
        Foo savedFoo = fooRepository.findOne(fooId);
        fooRepository.lock(savedFoo);

        // then
        // I want something like this to be lock wait,
        // something to confirm the above fooRepository.lock() work
        entityManager.getEntityManager().lock(savedFoo, LockModeType.PESSIMISTIC_WRITE);
    }

}

Foo类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.demo;

import java.util.UUID;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Foo {  
    @Id
    @GeneratedValue
    private UUID fooId;

    private String name;

    public UUID getFooId() {
        return fooId;
    }

    public void setFooId(UUID fooId) {
        this.fooId = fooId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

FooApplication类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class FooApplication {

    public static void main(String[] args) {
        SpringApplication.run(FooApplication.class, args);
    }
}

FooRepository类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.demo;

import java.util.UUID;

import org.springframework.data.jpa.repository.JpaRepository;

public interface FooRepository extends JpaRepository<Foo, UUID>, FooRepositoryCustom {  
}

FooRepositoryCustom类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.demo;

public interface FooRepositoryCustom {  
    public void lock(Foo foo);  
}

FooRepositoryImpl类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.demo;

import javax.persistence.EntityManager;
import javax.persistence.LockModeType;

import org.springframework.beans.factory.annotation.Autowired;

public class FooRepositoryImpl implements FooRepositoryCustom {

    @Autowired
    private EntityManager entityManager;

    @Override
    public void lock(Foo foo) {
        entityManager.lock(foo, LockModeType.PESSIMISTIC_WRITE);
    }   
}
EN

回答 2

Stack Overflow用户

发布于 2017-08-02 23:52:41

您的单元测试错了

您可以使用而不是编写单元测试来执行由某个第三方框架实现的功能。单元测试是给你的单位的!

换句话说:您不需要验证锁定是否如预期的那样工作。你的单位:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
entityManager.lock(foo, LockModeType.PESSIMISTIC_WRITE);

因此,您可以考虑在这里进行测试:确保使用预期参数调用实体管理器lock()方法。

意思:验证您的代码是否使用了您认为应该使用的框架--但是不要测试其他人的代码!当你的单元测试显示框架错误时你会怎么做.你不能改变这一点!(当然,您可以编写bug报告)

免责声明:在特殊情况下,您可能假设某个第三方产品有错误--那么编写一个单元测试来测试这个假设可能非常有用。这样,您以后就可以对该产品的新版本运行单元测试,以查看bug是否仍然存在。

票数 1
EN

Stack Overflow用户

发布于 2020-09-29 12:28:46

使用集成测试测试悲观锁定处理很重要(我可以说是强制性的吗?)原因有二:

  • 很有可能LockTimeout参数没有正确地配置(对于Oracle和PostgreSQL,在默认情况下它是无限时间),这可能会对系统的稳定性/性能产生巨大的影响;
  • 大多数关系数据库管理系统对悲观锁定的JPA实现非常有限,因为6个内部LockTimeout参数不同;仅针对内存中的数据库进行测试是不够的,需要特别考虑。

在博客文章用SpringBoot和JPA测试悲观锁处理中,您可以:

  • 阅读更多关于悲观锁处理的内容;
  • 您可以找到GitHub示例,用于对Oracle、PostgreSQL、MySQL和Apache进行测试。

Spring框架仅用作示例。您可以轻松地为其他框架调整测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45477459

复制
相关文章
智慧动物园基于SkeyeVSS技术的解决方案
金九银十黄金出游季,各地动物园当仁不让成为最火爆的游玩场所之一。当游客们沉迷于与动物们互动之际,动物园动物逃逸、动物打架斗殴、伤人等事件时有发生,给野生动物保护和社会公共安全带来隐患,造成了不良的社会影响。动物园管理者应加大动物园内游客、动物管理,杜绝动物伤人、游客不文明行为的发生。而视开科技推出的SkeyeVSS智慧安防视频监控在为构建智慧城市出力的同时,也为动物园的管控提供了新的思路。
Openskeye
2023/04/17
4910
【笔记】解决win最高管理员权限问题
(小声逼逼:平板装了win10+MacOS10.14+PE维护系统,三个系统都可以触摸+电磁笔操作
zby1101
2021/01/08
1.6K0
一脸懵逼学习Zookeeper(动物园管理员)---》高度可靠的分布式协调服务
1:Zookeeper是一个分布式协调服务;就是为用户的分布式应用程序提供协调服务   A、zookeeper是为别的分布式程序服务的   B、Zookeeper本身就是一个分布式程序(只要有
别先生
2018/01/02
7120
一脸懵逼学习Zookeeper(动物园管理员)---》高度可靠的分布式协调服务
sql导入默认用户解决杰奇cms无法登陆管理员账户问题
前些天下载杰奇cms来体验一下,从a5下载的杰奇1.8版,不是默认的安装程序,上传文件,手工导入sql数据库,修改了config配置文件,很快就完工了。前台可以展现,除了有些乱码显示之外,想要修改相关文件却是加密过的。/admin后台登录界面,用默认账号admin,admin无法登录
ytkah
2022/03/14
6550
sql导入默认用户解决杰奇cms无法登陆管理员账户问题
动物园园长 zookeeper
zookeeper是一个开源的分布式协调服务中间件 zookeeper能做什么? 数据的发布/订阅(配置中心:disconf) 、 负载均衡(dubbo利用了zookeeper机制实现负载均衡) 、 命名服务、 master选举(kafka、hadoop、hbase)、分布式队列、分布式锁 zookeeper的特性: 顺序一致性:从同一个客户端发起的事务请求,最终会严格按照顺序被应用到zookeeper中 原子性:所有的事务请求的处理结果在整个集群中的所有机器上的应用情况是一致的,也就是说,要么整个集群中的
用户2141593
2018/05/18
6440
BZOJ3670: [Noi2014]动物园(KMP)
给出一个字符串,定义$num[i]$表示在$[1, i]$区间内互不重复的相同前后缀的数量。
attack
2018/08/01
2630
BZOJ3670: [Noi2014]动物园(KMP)
谷歌AR“动物园”里有什么?
还记得P君曾在猫咪这种可爱的生物,当然要用AR/VR看才最过瘾!中,介绍过谷歌搜索AR程序中的那只猫吗?没错,就是那只非常软萌可爱的AR猫咪~ 每一根胡须、每一根毛发都栩栩如生,它眨巴着明亮的眼神看着你,谁能不心动呢?
VRPinea
2020/07/09
7840
谷歌AR“动物园”里有什么?
忘记Jenkins管理员密码的解决办法
1.进入\Jenkins\secrets目录,打开initialAdminPassword文件,复制密码;
ydymz
2018/09/10
1.8K0
ZooKeeper集群搭建
Zookeeper集群中只要有过半的节点是正常的情况下,那么整个集群对外就是可用的。正是基于这个特性,要将 ZK 集群的节点数量要为奇数(2n+1),如 3、5、7 个节点)较为合适。
会跳舞的机器人
2018/09/03
1.6K0
MacOS没有管理员账号的解决办法
重启电脑,启动时按住command+s,进入单一用户模式 输入 mount -uw /,然后回车 输入 rm /var/db/.AppleSetupDone ,然后回车 输入 reboot ,然后回车,电脑就会重启了
飞奔去旅行
2019/06/13
2.1K0
P2375 动物园
题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法。 某天,园长给动物们讲解KMP算法。 园长:“对于一个字符串S,它的长度为L。我们可以在O(L)的时间内,求出一个名为next的数组。有谁预习了next数组的含义吗?” 熊猫:“对于字符串S的前i个字符构成的子串,既是它的后缀又是它的前缀的字符串中(它本身除外),最长的长度记作next[i]。” 园长:“非常好!那你能
attack
2018/04/13
8320
解决webpack无法通过IP地址访问localhost的问题
只能用http://localhost:8080访问项目,不能用http://本机IP:8080访问
李维亮
2021/07/09
3.4K0
跨域问题导致的FLV直播地址无法播放如何解决?
在EasyNVR、EasyGBS、EasyDSS这一类视频平台中,经常会碰到用户问我们跨域相关的问题。在视频流的传输上,某些项目需要将视频流嵌入第三方平台或者app进行直播,这时极大可能会产生跨域相关的问题,这并不是传输上的问题,而是浏览器自带的机制。
TSINGSEE青犀视频
2021/10/14
5.6K0
跨域问题导致的FLV直播地址无法播放如何解决?
BZOJ 3670: [Noi2014]动物园【KMP变形 】
3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 2738  Solved: 1475 [Submit][Status][Discuss] Description 近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法。 某天,园长给动物们讲解KMP算法。 园长:“对于一个字符串S,它的长度为L。
Angel_Kitty
2018/04/09
9420
动物园(虚函数与多态)
某个动物园内,有老虎、狗、鸭子和猪等动物,动物园的管理员为每个动物都起了一个名字,并且每个动物都有年龄、体重等信息。每到喂食的时候,不同的动物都会叫唤(speak)。每种动物的叫唤声均不同,老虎的叫唤声是“AOOO”,狗的叫唤声是“WangWang”,鸭子的叫唤声是“GAGA”,猪的叫唤声是“HENGHENG”。
叶茂林
2023/07/30
1690
Microsoft 本地管理员密码解决方案 (LAPS)
问题 企业环境中计算机上本地帐户的真正问题是“本地”一词用词不当。如果网络上的 50 台计算机的本地管理员帐户为“Administrator”,密码为“P@55w0rd1!”,首先这是一个可怕的密码。其次,更重要的是,如果其中一台计算机受到威胁,它们都将受到威胁。Windows 非常有帮助。非常有用,如果您将本地管理员凭据传递给具有相同本地凭据的另一台计算机,则授予访问权限,就像您使用目标系统凭据登录一样。将管理员凭据转储到一个以获取所有管理员!缓解此问题的最佳方法是确保每台计算机都有一个不同的本地管理员帐户密码,该密码长、复杂且随机,并且会定期更改。
Khan安全团队
2022/01/24
4K0
Hadoop学习笔记—14.ZooKeeper环境搭建
从字面上来看,ZooKeeper表示动物园管理员,这是一个十分奇妙的名字,我们又想起了Hadoop生态系统中,许多项目的Logo都采用了动物,比如Hadoop采用了大象的形象,所以我们可以猜测ZooKeeper就是对这些动物进行一些管理工作的。
Edison Zhou
2018/08/20
3070
Hadoop学习笔记—14.ZooKeeper环境搭建
动物园IP网络广播-基于IP局域网络的动物园背景音乐广播系统
某动物园为中国陆地七大动物园之一,是国家建设部命名的全国“十佳”动物园,坐落于风景秀丽的水上公园南端,园内树木葱郁,碧草连茵,风光旖旎。全园占地54公顷,现有各类动物200余种,3000余只,其中国家一级保护动物大熊猫、东北虎、金丝猴、亚洲象、扭角羚、丹顶鹤等堪为稀世珍宝,国家二级保护动物小熊猫、大天鹅、猞猁等亦为世所罕见,更有来自别国异域的珍稀动物美洲虎、非洲狮、长颈鹿、犀牛、河马、北极熊、黑猩猩和金刚鹦鹉等,令游客一园览尽天下奇珍异兽。
北京海特伟业
2022/08/31
5220
动物园IP网络广播-基于IP局域网络的动物园背景音乐广播系统
分布式进阶__动物园园长 zookeeper
数据的发布/订阅(配置中心:disconf) 、 负载均衡(dubbo利用了zookeeper机制实现负载均衡) 、
矿泉水
2018/05/11
6921
分布式进阶__动物园园长 zookeeper
点击加载更多

相似问题

将字符串转换为数学公式

31

将R公式格式转换为数学公式

12

将数学公式转换为javascript

42

将数学公式转换为算法

21

将数学公式转换为JavaScript

120
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文