gpt4 book ai didi

java - 如何使用 Spring Boot + Spring Data JPA 对悲观锁定进行单元测试

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:31:28 25 4
gpt4 key购买 nike

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

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

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

FooRepositoryTest:

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 类:

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:

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 类:

package com.example.demo;

import java.util.UUID;

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

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

FooRepositoryCustom 类:

package com.example.demo;

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

FooRepositoryImpl 类:

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);
}
}

最佳答案

您的单元测试错误

不会编写单元测试来执行由某些第 3 方框架实现的功能。单元测试适用于您的单元!

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

entityManager.lock(foo, LockModeType.PESSIMISTIC_WRITE);

所以您可以考虑在此处测试的唯一事情:确保使用预期参数调用实体管理器 lock() 方法。

含义:验证您的代码确实使用了您认为应该使用的框架 - 但不要测试其他人的代码!你看 - 当你的单元测试显示框架错误时你会怎么做......你无法改变它! (当然,你可以写一个错误报告)

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

关于java - 如何使用 Spring Boot + Spring Data JPA 对悲观锁定进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45477459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com