Spring Data Jpa 如何为我的服务层创建单元测试?

2nc8po8w  于 2022-11-23  发布在  Spring
关注(0)|答案(1)|浏览(262)

我想了解并看到为我的服务层创建单元测试的最简单的方法。我已经研究了几天最简单的方法,但不幸的是,我仍然没有找到适合我的特定代码的解决方案。我尝试自己编写测试很多次,但人们告诉我,代码可以做得更好。提前感谢您。
我的实体:

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Builder
@Table
public class Appointment {

    @Id
    @SequenceGenerator(
            name = "appointment_sequence",
            sequenceName = "appointment_sequence",
            allocationSize = 1
    )
    @GeneratedValue(
            strategy = GenerationType.SEQUENCE,
            generator = "appointment_sequence"
    )
    private Long appointmentId;
    @Column(
            name = "date_of_appointment",
            nullable = false
    )
    private LocalDate dateOfAppointment;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(
            name = "patient_id",
            referencedColumnName = "patientId"
    )
    private Patient patient;

    public void connectWithPatient(Patient patient) {
        this.patient = patient;
    }
}

我的存储库:

public interface AppointmentRepository extends JpaRepository<Appointment, Long> {
}

我的服务:

@Service
public class AppointmentService implements AppointmentServiceInterface {

    private final AppointmentRepository appointmentRepository;
    private final PatientRepository patientRepository;

    @Autowired
    public AppointmentService(AppointmentRepository appointmentRepository, PatientRepository patientRepository) {
        this.appointmentRepository = appointmentRepository;
        this.patientRepository = patientRepository;
    }

    @Override
    public List<Appointment> getAllAppointments() {
        return appointmentRepository.findAll();
    }

    @Override
    public ResponseEntity<Appointment> getAppointmentById(Long appointmentId) {
        Appointment appointment = appointmentRepository.findById(appointmentId)
                .orElseThrow(()-> new ResourceNotFoundException("Appointment with id " + appointmentId + " doesn't exist."));
        return ResponseEntity.ok(appointment);
    }

    @Override
    public Appointment createNewAppointment(Appointment appointment) {
        return appointmentRepository.save(appointment);
    }

    @Override
    public ResponseEntity<Appointment> updateAppointment(Long appointmentId, Appointment appointmentUpdatedDetails) {
        Appointment updatedAppointment = appointmentRepository.findById(appointmentId)
                .orElseThrow(()-> new ResourceNotFoundException("Appointment with id " + appointmentId + " doesn't exist."));
        updatedAppointment.setDateOfAppointment(appointmentUpdatedDetails.getDateOfAppointment());
        appointmentRepository.save(updatedAppointment);
        return ResponseEntity.ok(updatedAppointment);
    }

    @Override
    public ResponseEntity<Appointment> deleteAppointment(Long appointmentId) {
        Appointment appointment = appointmentRepository.findById(appointmentId)
                .orElseThrow(()-> new ResourceNotFoundException("Appointment with id " + appointmentId + " doesn't exist."));
        appointmentRepository.delete(appointment);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

    @Override
    public Appointment makeAppointmentWithPatient(Long appointmentId, Long patientId) {
        Appointment appointment = appointmentRepository.findById(appointmentId)
                .orElseThrow(()-> new ResourceNotFoundException("Appointment with id " + appointmentId + " doesn't exist."));
        Patient patient = patientRepository.findById(patientId)
                .orElseThrow(()-> new ResourceNotFoundException("Patient with id " + patientId + " doesn't exist."));
        appointment.connectWithPatient(patient);
        return appointmentRepository.save(appointment);
    }
}
wmtdaxz3

wmtdaxz31#

返回ResponseEntity并不是您真正希望从服务层执行的操作--它是用于业务逻辑而不是Web响应的地方。
从好的方面来说,它不直接调用数据库,而是将DAO作为依赖项注入。
所以真实的的问题是你想在这里测试什么?如果你想测试服务本身,可以用一个简单的单元测试来进行单元测试,这里不需要spring:

  • 为Repositories创建模拟,并将它们注入到服务的示例中,该示例将成为测试的“主题”,就好像它们是真实的的DAO一样。
  • 然后指定如下期望:“如果有人调用findAll,则返回实体对象列表。
  • 验证使用某个Assert库测试的服务的方法的预期返回结果

当然,如果你从一些方法中返回真实的对象而不是ResponseEntity,你的代码会更干净,因此测试会更容易,因为你将验证真实的域对象而不是web-mvc抽象。

相关问题