Тестирование @Formula
Всем доброго времени суток! Возникла проблема: поля помеченные @Formula во время MockMVC тестирования не срабатывают. Если осуществлять проверку через Swagger, то работает все отлично, в тестах - иначе.
Метод контроллера (не обращайте внимания, если код с ошибками, главное - передана суть):
@Override
public ResponseEntity<PersonRsDto> create(PersonRqDto personRqDto) {
return Optional.ofNullable(personService.create(personRqDto))
.map(created -> {
created = personService.getById(created.getId());
return ResponseEntity.body(created);
})
.orElseThrow(() -> new BadRequestException(BAD_REQUEST_NO_CREATE));
}
Метод create:
@Override
@Transactional
public PersonRsDto create(@NonNull PersonRqDto personRqDto) {
var src = personMapper.toEntity(personRqDto);
var dst = personRepository.save(src);
return personMapper.toDto(dst);
}
Сущность Person:
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "persons")
public class Person {
/**
* Идентификатор
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* Имя сотрудника
*/
@Column(name = "name", nullable = false)
private String name;
/**
* Фамилия сотрудника
*/
@Column(name = "surname", nullable = false)
private String surname;
/**
* Отчество сотрудника
*/
@Column(name = "middle_name")
private String middleName;
/**
* Полное имя
*/
@Formula("CONCAT_WS( ' ', surname, name, middle_name ) ")
private String fullName;
/**
* Краткое имя
*/
@Formula("CONCAT_WS( ' ', " +
" surname, " +
" CASE WHEN name IS NULL OR TRIM(name) = '' THEN NULL ELSE (UPPER(SUBSTRING(TRIM(name), 1, 1)) || '.' ) END, " +
" CASE WHEN middle_name IS NULL OR TRIM(middle_name) = '' THEN NULL ELSE (UPPER(SUBSTRING(TRIM(middle_name), 1, 1)) || '.' ) END) ")
private String shortName;
}
Тест:
@SpringBootTest
@ActiveProfiles({"test"})
@AutoConfigureMockMvc
class PersonAPITest extends AbstractContainerizedTest {
@Autowired
private MockMvc mockMvc;
@Test
@DisplayName("Создание сотрудника")
void createPerson() throws Exception {
final var personName = "name";
final var personSurname = "surname";
final var personRqDto = PersonRqDto.builder()
.name(personName)
.surname(personSurname)
.build();
mockMvc.perform(postJson(personRqDto, COMMON_API_URI))
.andDo(print())
.andExpect(status().isCreated())
.andExpect(jsonPath("personNumber", equalTo(personNumber)))
.andExpect(jsonPath("name", equalTo(personName)))
.andExpect(jsonPath("surname", equalTo(personSurname)))
.andExpect(jsonPath("fullName", equalTo("что-то"))); //NPE
}
Ответы (1 шт):
Автор решения: MaxDen
→ Ссылка
В общем и целом методы save и getById работали в рамках одной сессии и поэтому при вызове метода getById не осуществлялся запрос в БД, а информация (об объекте) бралась из кэша. Чтоб решить эту проблему нужно в properties указать:
open-in-view: false
Огромная благодарность пользователю: Roman-Stop RU aggression in UA