Problem z testowaniem Deleta w SpringBoot MockMvc

0

Cześć

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

  @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

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

oraz jej service

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:

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ć :/

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:

@OneToMany(orphanRemoval = true, cascade = CascadeType.REMOVE)
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.

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.


@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 ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1