gpt4 book ai didi

java - 使用spring boot时如何在UnitTest中使用postgres函数

转载 作者:行者123 更新时间:2023-12-02 05:59:17 27 4
gpt4 key购买 nike

我有一个使用 PostgreSQL 自动生成 Student_no 的函数。当我在 Postgres 和 Spring boot 中使用它时,它工作得非常完美。但是当我在单元测试中使用它时遇到问题。在 Postgres 中,当我使用以下命令时:

Insert into students(firstName,lastName,age) 
values ('Nguyen','Tran',12)

在数据库中,student_no 自动生成器看起来像“28372”。 Spring boot 也是一样的。当我调用方法:studentRepository.save(student)时,它会自动生成student_no。但是当我进行以下单元测试时:

@Slf4j
public class StudentTest {

@Mock
private StudentRepository studentRepository;

@Test
public void testGenerateStudentBooking_validRequest() {
Student student = new Student("Nguyen","Tran",23);
Student student = studentRepository.save(student);
}
}

当我保存并调试时,没有生成student_no。我不明白为什么?

类(class)学生:

@Entity
@NoArgsConstructor
@RequiredArgsConstructor
public class Student {

@Id
private String id;
private String firstName;
private String lastName;
private Integer age;
private String student_no;
}

学生存储库

public inteface StudentRepository extends CrudRepository(Student,Integer) {
Student findStudentByStudentNo(String StudentNo);
}

学生测试

@Slf4j
public class StudentTest {

@Mock
private StudentRepository studentRepository;

@Test
public void testGenerateStudentBooking_validRequest() {
Student student = new Student("Nguyen","Tran",23);
Student student = studentRepository.save(student);
//Student.studentNo is null :(

Student student1 = studentRepository.findStudentByStudentNo(student.getStudentNo);
}
}

如果可能的话,我如何告诉hibernate booking_no 将自动生成并且hibernate 不会对其执行任何操作。或者换句话说,在使用UnitTest时如何使用Postgres中的函数自动生成booking_no。

最佳答案

有两种方法可以解决您的问题

  1. 您可以在内存数据库中使用H2进行集成测试,因此不需要模拟StudentRepository
  2. 第二种方法是模拟您现在正在关注的 StudentRepository

第二种方法的问题是您需要为模拟对象定义 stub ,表示每当调用 StudentRepository.save() 方法时都会返回具有随机生成的 id 的学生对象

 @Slf4j
public class StudentTest {

@Mock
private StudentRepository studentRepository;

@Test
public void testGenerateStudentBooking_validRequest() {
Random random = new Random();
when(this.studentRepository(ArgumentMatchers.any()))
.thenReturn(new Student("Nguyen","Tran",23,random.nextInt(900) + 100 ));
//random.nextInt(900) + 100 will generate a random integer from 0 to 899, then add 100
Student student = new Student("Nguyen","Tran",23);
Student student = studentRepository.save(student);

您还可以使用ThreadLocalRandom生成100(含)到1000(不含)之间的随机int值

ThreadLocalRandom.current().nextInt(100, 1000);

关于java - 使用spring boot时如何在UnitTest中使用postgres函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55988455/

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