简体   繁体   中英

Test spring repository with pageRequest

Im have repository:

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
    List<Product> findAllByPriceBetween(BigDecimal from, BigDecimal to, PageRequest pageRequest);
}

In liquibase im just create table:

--liquibase formatted sql
--changeset <sniklz>:<create-products-table>
CREATE TABLE IF NOT EXISTS products
(
    id bigint auto_increment,
    title varchar(255) not null,
    price decimal      not null,
    CONSTRAINT product_pl PRIMARY KEY (id)
);

--rollback DROP TABLE products;

then im try to test my repository:

@DataJpaTest
@Testcontainers
@AutoConfigureTestDatabase (replace = AutoConfigureTestDatabase.Replace.NONE)
class ProductRepositoryTest  {
    @Container
    static MySQLContainer<?> database = new MySQLContainer<>("mysql:8")
            .withDatabaseName("springboot")
            .withPassword("springboot")
            .withUsername("springboot");

    @DynamicPropertySource
    static void setDataSourceProperties(DynamicPropertyRegistry propertyRegistry) {
        propertyRegistry.add("spring.datasource.url", database::getJdbcUrl);
        propertyRegistry.add("spring.datasource.username", database::getUsername);
        propertyRegistry.add("spring.datasource.password", database::getPassword);
    }

    @Autowired
    private ProductRepository productRepository;

    @Test
    @Sql("/scripts/init_four_products.sql")
    void shouldReturnProductPriceGreaterThan1200() {
        List<Sort.Order> order = new ArrayList<>();
        order.add(new Sort.Order(Sort.Direction.DESC, "price"));
        Sort sort = Sort.by(order);
        PageRequest pageRequest = PageRequest.of(0, 10, sort);
        List<Product> acutal = productRepository.findAllByPriceBetween(BigDecimal.valueOf(1200),
                BigDecimal.valueOf(Integer.MAX_VALUE), pageRequest);
        Assertions.assertEquals(1, acutal.size());
        Assertions.assertEquals("iPhone XI", acutal.get(0).getTitle());
    }
}

in /scripts/init_four_products.sql im just create som products:

INSERT INTO products (title, price) VALUES ("iPhone 8", 700);
INSERT INTO products (title, price) VALUES ("iPhone 9 ", 800);
INSERT INTO products (title, price) VALUES ("iPhone X", 1000);
INSERT INTO products (title, price) VALUES ("iPhone XI", 1200);

But have error:

org.springframework.dao.InvalidDataAccessApiUsageException: At least 3 parameter(s) provided but only 2 parameter(s) present in query.; nested exception is java.lang.IllegalArgumentException: At least 3 parameter(s) provided but only 2 parameter(s) present in query.

did not find any useful information at google

According to Spring documentation :

The infrastructure recognizes certain specific types like Pageable and Sort , to apply pagination and sorting to your queries dynamically.

With that being said, you should replace PageRequest with Pageable in the ProductRepository method:

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
    List<Product> findAllByPriceBetween(BigDecimal from, BigDecimal to, Pageable pageable);
}

Pageable should be instantiated as follows:

Pageable pageable = PageRequest.of(0, 10, sort); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM