Как использовать функцию postgres в UnitTest при использовании весенней загрузки - PullRequest
0 голосов
/ 05 мая 2019

У меня есть функция автоматического создания student_no с использованием PostgreSQL.Он отлично работает, когда я использую его в загрузке Postgres и Spring.Но у меня есть проблема, когда я использую его в модульных тестах.В Postgres, когда я использую следующую команду:

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

в базе данных student_no автоматический генератор выглядит как "28372".То же самое и с Spring boot.Когда я вызываю метод: studentRepository.save(student), он автоматически генерирует student_no.Но когда я выполняю следующий UnitTest:

@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 не генерируется.Не могу понять почему?

ученик класса:

@Entity
@NoArgsConstructor
@RequiredArgsConstructor
public class Student {

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

репозиторий Student

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 будетавтоматически сгенерированный и спящий режим ничего с этим не сделает.Или, другими словами, как автоматически генерировать booking_no с помощью функции в Postgres при использовании UnitTest.

1 Ответ

0 голосов
/ 05 мая 2019

Есть два способа решения вашей проблемы

  1. Вы можете использовать H2 в базе данных памяти для интеграционного тестирования, поэтому вам не нужно высмеивать StudentRepository
  2. Второй способ - это издевательство над StudentRepository тем, за кем вы сейчас следите.

Проблема второго подхода заключается в том, что вам нужно определить заглушку для объектов с надписью, говоря, что всякий раз, когда вызывается метод 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 для генерации случайного значения типа int между 100 (включая) и 1000 (исключая)

ThreadLocalRandom.current().nextInt(100, 1000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...