Mam na przykład klasę
@Setter
@EqualsAndHashCode(of = "id")
@Entity
public class MovieBoxOfficeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter(AccessLevel.NONE)
private Long id;
}
który ma automatycznie generowany identyfikator bez ręcznego ustawiania. Mam również klasę z metodą
@Entity
@Table(name = "movies")
public class MovieEntity {
List<MovieBoxOffice> boxOffices = new ArrayList<>();
public void addBoxOffice(MovieBoxOffice boxOffice) throws ResourceConflictException {
if (this.boxOffices.contains(boxOffice)) {
throw new ResourceConflictException("A box office with id " + boxOffice.getId() + " is already added");
}
this.boxOffices.add(boxOffice);
}
}
Występuje problem z testowaniem metody addBoxOffice
, ponieważ porównywanie obiektów MovieBoxOfficeEntity
odbywa się za pomocą identyfikatora id
, a identyfikator jest generowany automatycznie tylko podczas zapisu do bazy danych i nie można go ustawić ręcznie.
Wpadłem na pomysł dodania pola uniqueId
do klasy MovieBoxOfficeEntity
i dodania go do adnotacji @EqualsAndHashCode
@Setter
@EqualsAndHashCode(of = {"id", "uniqueId"})
@Entity
public class MovieBoxOfficeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter(AccessLevel.NONE)
private Long id;
private String uniqueId = UUID.randomUUID().toString();
}
to mogę przetestować w ten sposób
@Test(expected = ResourceConflictException.class)
public void canAddBoxOffice() throws ResourceConflictException{
final String id = UUID.randomUUID().toString();
final MovieBoxOfficeEntity boxOffice = new MovieBoxOfficeEntity();
boxOffice.setUniqueId(id);
this.movieEntity.addBoxOffice(boxOffice);
this.movieEntity.addBoxOffice(boxOffice);
}
w ten sposób obiekt boxOffice
będzie posiadał
id: null
uniqueId: jakieś wygenerowane UUID
a porównanie obiektów odbędzie się w oparciu uniqueId
, bo każde id
będzie null
.
Co sądzicie o tworzeniu pola uniqueId
głównie w celu testowania metod encji?