我想了解并看到为我的服务层创建单元测试的最简单的方法。我已经研究了几天最简单的方法,但不幸的是,我仍然没有找到适合我的特定代码的解决方案。我尝试自己编写测试很多次,但人们告诉我,代码可以做得更好。提前感谢您。
我的实体:
@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);
}
}
1条答案
按热度按时间wmtdaxz31#
返回
ResponseEntity
并不是您真正希望从服务层执行的操作--它是用于业务逻辑而不是Web响应的地方。从好的方面来说,它不直接调用数据库,而是将DAO作为依赖项注入。
所以真实的的问题是你想在这里测试什么?如果你想测试服务本身,可以用一个简单的单元测试来进行单元测试,这里不需要spring:
findAll
,则返回实体对象列表。当然,如果你从一些方法中返回真实的对象而不是
ResponseEntity
,你的代码会更干净,因此测试会更容易,因为你将验证真实的域对象而不是web-mvc抽象。