Реализация Soft Delete в проекте Spring Boot на основе MongoDB

Мне нужно реализовать мягкое удаление в проекте Spring Boot, который использует MongoDB в качестве своей базы данных. В классе сущности под названием Farmer я объявил логическое значение is_deleted, которое по умолчанию установлено равным false

@JsonIgnoreProperties(ignoreUnknown = true)
@Document(collection = "farmers")
public class Farmer {

    @Id
    private String id;

    private String name;

    private String nationalId;

    private String location;

    private boolean is_deleted = false;

    public Farmer(final String id, final String name, final String nationalId final String location){
    this.id = id;
    this.name = name;
    this.nationalId = nationalId;
    this.location = location;
}
} 

Затем я аннотировал функции в моем классе MongoRepository с помощью @Query(value="{'is_deleted': false}") отфильтровывать только те записи, которые не были удалены для следующих функций:

   public interface FarmerRepository extends MongoRepository<Farmer, Integer> {

    @Query(value="{'is_deleted': false}")
    Page<Farmer> findAllByName(@Param("name") String name,Pageable pageable);

    @Query(value="{'is_deleted': false}")
    Farmer findByNationalId(@Param("nationalId") String nationalId);

    @Query(value="{'is_deleted': false}")
    Page<Farmer> findAllByLocation (@Param("location") String location, Pageable pageable);

    @Query(value="{'is_deleted': false}")
    Farmer findById(@Param("id") String id);

    @Query(value="{'is_deleted': false}")
    Page<Farmer> findAllByLocationAndName(@Param("location") String location, @Param("name") String name,
                                          Pageable pageable);

} 

Я также объявил следующие функции в моем слое обслуживания, которые обращаются к этим функциям MongoRepository

    @Service
    public class FarmerService {

        private final FarmerRepository farmerRepository;

        @Autowired
        public FarmerService(final FarmerRepository farmerRepository){
            this.farmerRepository = farmerRepository;
        }

        public Farmer createFarmer ( Farmer farmer){
                this.farmerRepository.save(farmer);
                return farmer;
        }
        public Farmer findFarmerById(String id){
            Farmer farmerFoundById = this.farmerRepository.findById(id);
            return farmerFoundById;
        }

        public Page<Farmer> findFarmersByName(final String name, final int page, final int size){
            Page<Farmer> findFarmersPage = this.farmerRepository.findAllByName(name, new PageRequest(page,size));
            return findFarmersPage;
        }

        public Farmer findFarmerByNationalId(String nationalId){
            Farmer farmerFoundByNationaId = this.farmerRepository.findByNationalId(nationalId);
            return farmerFoundByNationaId;
        }

        public Page<Farmer> findFarmersByLocation(final String location, final int page, final int size){
            Page<Farmer> farmersFoundByLocation = this.farmerRepository.
                    findAllByLocation(location,new PageRequest(page,size));
            return farmersFoundByLocation;
        }

        public Page<Farmer> findFarmersByLocationAndName(String location, String name,final int page,
                                                         final int size){
            Page<Farmer> farmersFoundByLocationAndName =
                    this.farmerRepository.findAllByLocationAndName(location,name,new PageRequest(page,size));
            return farmersFoundByLocationAndName;
        }

        public void deleteFarmer(String id){
            Farmer deletedFarmer = this.farmerRepository.findById(id);
            deletedFarmer.setIs_deleted(true);
            this.farmerRepository.save(deletedFarmer);
        }
    } 

Однако, когда я запускаю модульные тесты, чтобы проверить, можно ли получить доступ к фермерам с тем же именем и местоположением, тест не пройден. Ниже приведены тесты, которые не выполняются со следующей ошибкой:

Ошибка Assertion: ожидается:<2>, но была:<1>

@Test
public void findMultipleFarmersByLocationAndName_failWhenMultipleFarmersInSameLocationWithSameNameNotFound(){
    Farmer farmer = new Farmer("1", "John Doe", "1", "Freetown");
    Farmer farmer2 = new Farmer("2", "John Doe", "2", "Freetown");
    Farmer farmer3 = new Farmer("3", "John Smith", "3", "Freetown");

    Farmer savedFarmer1 = this.farmerService.createFarmer(farmer);
    Farmer savedFarmer2 = this.farmerService.createFarmer(farmer2);
    Farmer savedFarmer3 = this.farmerService.createFarmer(farmer3);
    Page<Farmer> farmersFoundByLocationAndName = this.farmerService.
            findFarmersByLocationAndName(farmer.getLocation(),farmer.getName(),0,5);
    assertEquals("Farmers not found with same location and name", 2,
            farmersFoundByLocationAndName.getTotalElements());
}

@Test
public void findMultipleFarmersByLocation_failWhenMultipleFarmersInSameLocationNotFound(){
    Farmer farmer = new Farmer("1", "John Doe", "1", "Freetown");
    Farmer farmer2 = new Farmer("2", "John Smith", "2", "Freetown");
    Farmer savedFarmer1 = this.farmerService.createFarmer(farmer);
    Farmer savedFarmer2 = this.farmerService.createFarmer(farmer2);
    Page<Farmer> farmersFoundByLocation = this.farmerService.findFarmersByLocation(farmer.getLocation(),
            0,5);
    assertEquals("Farmers not found with same location", 2,
            farmersFoundByLocation.getTotalElements());
}

@Test
public void findMultipleFarmersByName_failWhenMultipleFarmersWithSameNameNotFound(){
    Farmer farmer = new Farmer("1", "John Doe", "1", "Earth");
    Farmer farmer2 = new Farmer("2", "John Doe", "2", "Earth");
    Farmer savedFarmer1 = this.farmerService.createFarmer(farmer);
    Farmer savedFarmer2 = this.farmerService.createFarmer(farmer2);
    //List<Farmer> farmersFoundByName = this.farmerService.findFarmersByName(farmer.getName());
    Page<Farmer> farmersFoundByName = this.farmerService.findFarmersByName(farmer.getName(),0,5);
    assertEquals("Farmer with name not detected", 2, farmersFoundByName.getTotalElements());
    //assertEquals("Farmer with name not detected", 2, farmersFoundByName.size());
}

Любые выводы о том, где я иду не так, будут оценены. Я неправильно использовал аннотации @Query в MongoRepository?

0 ответов

Другие вопросы по тегам