작업하면서 배우는 것들

ReactiveMongoRepository 를 위한 작업

Jungsoomin :) 2021. 1. 21. 23:19

필요의존

  • 일단, Reactive 한 MongoRepository 를 만드려면, Spring-data-Mongo-Reactive 의존이 필요
  • Spring-Data-Mongo-Reactive 의존이 없다면 de.flapdoodle.embed.mongo 가 모조리 터져버림
  • 리엑티브 스트림 기반으로 만들어진 io.projectreactor:reactor-test 의존도 필요함.
testImplementation('org.springframework.boot:spring-boot-starter-test') {
            exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
        }
        
testImplementation 'io.projectreactor:reactor-test'   
implementation "org.springframework.boot:spring-boot-starter-data-mongodb-reactive"
    testImplementation "de.flapdoodle.embed:de.flapdoodle.embed.mongo"

 

이후, Repository 의 구현 인터페이스는 ReactiveMongoRepository<Entity, Id> 로 변경 됨

@Transactional(readOnly = true)
public interface ProductRepository extends ReactiveCrudRepository<ProductEntity,String> {
    Optional<ProductEntity> findByProductId(int productId);
}

 

비동기 방식의 테스트는 비동기 시퀀스 스트림을 만드는 StepVerifier , Mono & Flux 의 block() 메서드로 결과를 기다리게 됨

    @BeforeEach
    public void setUpDb() {
        System.out.println("Before");
        StepVerifier.create(productRepository.deleteAll()).verifyComplete();

        ProductEntity entity = new ProductEntity(1, "n", 1);
        StepVerifier.create(productRepository.save(entity))
                .expectNextMatches(createdEntity -> {
                    productEntity = createdEntity;
                    return areProductEqual(entity, productEntity);
                })
                .verifyComplete();
    }



    @Test
    public void create() {
        ProductEntity newEntity = new ProductEntity(2, "n", 2);

        StepVerifier.create(productRepository.save(newEntity))
                .expectNextMatches(createdEntity -> newEntity.getProductId() == createdEntity.getProductId())
                .verifyComplete();

        StepVerifier.create(productRepository.findById(newEntity.getId()))
                .expectNextMatches(foundEntity -> areProductEqual(newEntity, foundEntity))
                .verifyComplete();

        StepVerifier.create(productRepository.count()).expectNext(2l).verifyComplete();
    }