Problem z testowaniem Deleta w SpringBoot MockMvc

Problem z testowaniem Deleta w SpringBoot MockMvc
Tomasz J
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:22
0

Cześć

Testuje teraz aplikacje w Springu za pomocą MocMvc i teraz tak wygląd mój test i taki mam błąd

Kopiuj
  @Test
    @DisplayName("Should delete Classes Box by Id ")
    void shouldDeleteClassBlockById() throws Exception {

        this.mockMvc
                .perform(delete("/classBlocks?classBlockId=1"))
                .andDo(print())
                .andExpect(status().isOk());

        /* TODO - why?whyyyyyyyyyyyyy???
            log:
            org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["FKvpqxtuay01bo3jtvv8uijs5c: PUBLIC.courses_class_block_list FOREIGN KEY(class_block_list_id) REFERENCES PUBLIC.class_block(id) (CAST(1 AS BIGINT))"; SQL statement:
            delete from class_block where id=? [23503-214]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
         */
    }

Tak wygląda metoda w klasie do której piszę test

Kopiuj
@DeleteMapping
    public ResponseEntity<HttpStatus> deleteClassBlock(@RequestParam("classBlockId") Long id) {
        return classBlockService.deleteClassBlock(id);
    }

oraz jej service

Kopiuj
public ResponseEntity<HttpStatus> deleteClassBlock(Long id) {
        ClassBlock classBlock = classBlockRepository
                .findById(id)
                .orElseThrow(() -> new ResourceNotFoundException("Class Block with id:" + id + "not exist"));

        classBlockRepository.delete(classBlock);
        return new  ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

i jej model:

Kopiuj
package com.example.trainingmanagementsystem.Model;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;

import java.util.LinkedList;
import java.util.List;

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ClassBlock {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "CLASS_BLOCK_NAME")
    private String name;

    @OneToMany
    private List<Classes> classesList = new LinkedList<>();

}

Jeżeli będzie potrzeba więcej informacji to powiedzcie to podeśle albo link do repo na gicie,

Moje pytanie brzmi. Jak prawidłowo napisać tego deleta żeby przeszedł na zielono bo już kombinuje na wszystkie sposoby i już na serio nie wiem jak to napisać :/

edytowany 2x, ostatnio: Tomasz J
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
1

Chcesz usunąć parenta, do którego mają już referencje niektóre dzieci. No i spoko, tylko jak używasz JPA to nad polem classesList dodaj jeszcze to:

Kopiuj
@OneToMany(orphanRemoval = true, cascade = CascadeType.REMOVE)
Tomasz J
dodałem i rozumiem, że to pozwala na usunięcie kaskadowe, ale mimo to test nie działa nadal poprawnie, mam ten sam błąd
SA
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:94
1

Pokaż tę klasę "Classes" (nazwy klasy pisze się w liczbie pojedynczej tak w ogóle). Błąd jest zwiazany z kluczem obcym. W klasie ClassBlock powinieneś mieć @OneToMany(mappedBy = "classblock") a w tej "Classes" @ManyToOne ClassBlock.

Tomasz J
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:22
0
Sampeteq napisał(a):

Pokaż tę klasę "Classes" (nazwy klasy pisze się w liczbie pojedynczej tak w ogóle). Błąd jest zwiazany z kluczem obcym. W klasie ClassBlock powinieneś mieć @OneToMany(mappedBy = "classblock") a w tej "Classes" @ManyToOne ClassBlock.

Kopiuj

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Classes {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "TOPIC")
    private String topic;

    @Column(name = "DATE")
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE, pattern = "yyyy-MM-dd")
    private LocalDate date;
}

z kluczem obcym powiadasz, to by miało sens czemu wywala błąd

i zmienie nazwę klasy ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.