Использование @SneakyThrows в JUNIT тестах в Spring
Я сделал такую сущность Brand в Hibernate
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "brands")
public class Brand {
@Setter(AccessLevel.NONE)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
public Brand(String name) {
this.name = name;
}
}
Setter для поля id я не хочу делать, т.к. Hibernate сам позаботится о присвоении id при сохранении. Считаю незачем открывать его, чтобы методы из других классов его не изменяли. При этом встает маленькая проблема при unit-тестировании сервисов, где извлекаются эти сущности. Мне приходится через org.springframework.util.ReflectionUtils делать так:
public class BrandServiceTest {
private BrandService brandService;
private BrandRepository brandRepository;
@BeforeEach
public void init() {
brandRepository = mock(BrandRepository.class);
brandService = new BrandServiceImpl(brandRepository);
}
@Test
public void testFindAll() {
List<Brand> expectedBrands = new ArrayList<>();
Brand brand = new Brand("Brand1");
ReflectionUtils.setField(brand.getClass().getField("id"), brand, 1L);
expectedBrands.add(brand);
when(brandRepository.findAll())
.thenReturn(expectedBrands);
List<BrandDto> resultBrands = brandService.findAll();
assertNotNull(resultBrands);
assertEquals(expectedBrands.size(), resultBrands.size());
assertEqualsBrands(expectedBrands, resultBrands);
}
Т.е. мне надо через Reflection присвоить некоторое значение полю id. В связи с этим:
Вопрос №1: приветствуется ли в тестах присваивать через Reflection значения полей?
Далее, т.к. вызов
brand.getClass().getField("id")
способен генерировать проверяемое исключение, а я его ловить не хочу, т.к. знаю, что это поле есть и поэтому хочу поставить аннотацию @SneakyThrows над методом testFindAll().
Вопрос №2: хорошо ли ставить такую аннотацию в тестах?