Как сделать полное обновление существующей сущности JPA при тестировании? - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть объект JPA, который может получать обновления через HTTP API. Контроллер работает только с представлением (DTO) сущности Person и не предоставляет никаких @Entity аннотированных классов.

Ниже приведен упрощенный фрагмент класса сущности:

public class Person {

    @Id
    @GeneratedValue
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private UUID uuid;
    private String title;
    private String prefix;
    private String firstName;
    private String lastName;
    private String description;
}

@RestController предоставляет конечную точку PUT, которая принимает представление человека как @RequestBody, а UUID - как @PathVariable.

. Следующий метод класса PersonService должен только выполните обновление, если человек существует:

@Override
public Person update(Person person, UUID uuid) {
    personRepository.findById(uuid) (1)
            .orElseThrow(() -> new Exception(ommitted));

    //boolean existsById = personRepository.existsById(uuid); (2)

    person.setUuid(uuid);
    return personRepository.save(person);
}

Выполнение следующих результатов теста в java.lang.UnsupportedOperationException

@Test
public void updatePersonWillFail() throws Exception {
    ModelMapper converter = new ModelMapper();
    ObjectMapper mapper = new ObjectMapper();

    Person person = EntityProvider.getPersonBienhaus();
    person = personRepository.saveAndFlush(person);

    // I assume this will be immediately written so the database/underlying entity?
    // Skipping this and creating a Representation of the person with the same properties
    //person.setDescription("This is an updated description!");

    PersonModel personModel = ModelProvider.getPersonModelBienhaus();

    // Updating the person 'description' only for the representation
    personModel.setDescription("This is an updated description!");
    personModel.setUuid(person.getUuid());

    mockMvc.perform(put("/persons/{uuid}", personModel.getUuid())
            .accept(MediaType.APPLICATION_JSON)
            .contentType(MediaType.APPLICATION_JSON)
            .content(mapper.writeValueAsBytes(personModel)))
            .andExpect(status().isOk());

}

Примечание : Когда я не использую PersonRepository в тесте, чтобы сохранить сущность, но вместо этого выполнить POST, все работает как положено.

Что я также не понимаю в приведенном выше PersonService update() - Метод заключается в том, что (1) не выдает исключение, но когда раскомментирует (2), это приводит к false, хотя человек, очевидно, существует в противном случае (1) должен был выбросить исключение.

Теперь мои вопросы:

  1. Как я могу проверить т он обновляет без выполнения предыдущих POST операций?
  2. Как может получиться, что (1) не выдает исключение, но (2) - это false
  3. Что было бы подходящим способом для проверить описанный сценарий?
  4. Чего мне не хватает, что приводит меня в замешательство?

Спасибо за вашу помощь!

Обновление:

  • Использование @Version на объекте решает вопрос №. 2. Я предполагаю, что UUID вызывает некоторые проблемы, поэтому он не может определить, существует объект или нет. Но я до сих пор не знаю, почему он не создает исключение.
...