Тестирование @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

→ Ссылка