Ich habe versucht, einige Tests für die Serviceschicht in meinem Java-Projekt durchzuführen. Der Test sollte lediglich das Hinzufügen eines neuen Patienten zur Datenbank simulieren. Nachdem ich ständig versagt hatte, gab ich einfach auf und kam hierher, um Hilfe zu suchen.
Mein aktueller Code für die Testklasse lautet wie folgt:
@ExtendWith(MockitoExtension.class)
public class PatientServiceTest {
@Mock
private PatientDao patientDao;
@InjectMocks
private PatientServiceImpl patientService;
@BeforeEach
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testSave() {
PatientEntity patient = new PatientEntity();
PatientTO patientTO = new PatientTO();
patientTO.setId(1L);
when(PatientMapper.mapToEntity(patientTO)).thenReturn(patient);
when(patientDao.save(patient)).thenReturn(patient);
PatientTO result = patientService.save(patientTO);
assertNotNull(result);
verify(patientDao, times(1)).save(patient);
// verify(PatientMapper.mapToEntity(patientTO), times(1));
}
}
Mapper
public class PatientMapper {
public static PatientTO mapToTO(final PatientEntity patientEntity) {
if (patientEntity == null) return null;
final PatientTO patientTO = new PatientTO();
patientTO.setId(patientTO.getId());
patientTO.setFirstName(patientEntity.getFirstName());
patientTO.setLastName(patientEntity.getLastName());
patientTO.setTelephoneNumber(patientEntity.getTelephoneNumber());
patientTO.setEmail(patientEntity.getEmail());
patientTO.setPatientNumber(patientEntity.getPatientNumber());
patientTO.setDateOfBirth(patientEntity.getDateOfBirth());
patientTO.setDoesHaveChronicDiseases(patientEntity.getDoesHaveChronicDisease());
return patientTO;
}
public static PatientEntity mapToEntity(final PatientTO patientTO) {
if (patientTO == null) return null;
final PatientEntity patientEntity = new PatientEntity();
patientEntity.setId(patientTO.getId());
patientEntity.setFirstName(patientTO.getFirstName());
patientEntity.setLastName(patientTO.getLastName());
patientEntity.setTelephoneNumber(patientTO.getTelephoneNumber());
patientEntity.setEmail(patientTO.getEmail());
patientEntity.setPatientNumber(patientTO.getPatientNumber());
patientEntity.setDateOfBirth(patientTO.getDateOfBirth());
patientEntity.setDoesHaveChronicDisease(patientTO.getDoesHaveChronicDiseases());
return patientEntity;
}
}
DAO
public interface PatientDao extends Dao
{ }
DAO-Impl
@Repository
public class PatientDaoImpl extends AbstractDao
implements PatientDao{ }
Entität
@Entity
@Table(name = "PATIENT")
public class PatientEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String firstName;
@Column(nullable = false)
private String lastName;
@Column(nullable = false)
private String telephoneNumber;
private String email;
@Column(nullable = false)
private String patientNumber;
@Column(nullable = false)
private LocalDate dateOfBirth;
@Column(nullable = false)
private Boolean doesHaveChronicDisease;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getTelephoneNumber() {
return telephoneNumber;
}
public void setTelephoneNumber(String telephoneNumber) {
this.telephoneNumber = telephoneNumber;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPatientNumber() {
return patientNumber;
}
public void setPatientNumber(String patientNumber) {
this.patientNumber = patientNumber;
}
public LocalDate getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(LocalDate dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
public Boolean getDoesHaveChronicDisease() {
return doesHaveChronicDisease;
}
public void setDoesHaveChronicDisease(Boolean doesHaveChronicDisease) {
this.doesHaveChronicDisease = doesHaveChronicDisease;
}
}
Service
public interface PatientService {
PatientTO findById(final Long ID);
PatientTO save(final PatientTO patientTO);
}
Service-Impl
@Service
@Transactional
public class PatientServiceImpl implements PatientService {
private final PatientDao patientDao;
@Autowired
public PatientServiceImpl(PatientDao patientDao){
this.patientDao = patientDao;
}
@Override
public PatientTO findById(Long ID) {
final PatientEntity patientEntity = patientDao.findOne(ID);
return PatientMapper.mapToTO(patientEntity);
}
@Override
public PatientTO save(PatientTO patientTO) {
final PatientEntity patientEntity = PatientMapper.mapToEntity(patientTO);
patientDao.save(patientEntity);
return PatientMapper.mapToTO(patientEntity);
}
}
Ich habe bereits viele Fehler behandelt, aber der am häufigsten auftretende ist:
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);
Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
Mocking methods declared on non-public parent classes is not supported.
2. inside when() you don't call method on mock but on some other object.
was zeigt auf:
when(patientMapper.mapToEntity(patientTO)).thenReturn(patient);
Aber ich habe es bereits verspottet oder als konkretes Objekt verwendet. Wie kann ich mich verbessern? Wie kann ich mithilfe von Kaskaden einen Test schreiben, bei dem ich überprüfen kann, ob nach dem Löschen des Patienten auch alle seine Termine gelöscht wurden?
Ich kann keinen guten Test für die Serviceschicht in einer Java-Anwendung schreiben ⇐ Java
-
- Similar Topics
- Replies
- Views
- Last post