【问题标题】:How can i test paginated result in spring boot?如何在 Spring Boot 中测试分页结果?
【发布时间】:2021-07-12 19:46:14
【问题描述】:

我是编写单元测试的新手。我尝试了一些东西并且 saveProduct 测试通过了,但是我不知道如何测试分页方法,并且以这种方式编写测试是否是一种好方法。请告诉我我做错了什么以及如何为我的服务实现类编写正确的单元测试? 我还需要测试存储库接口吗?

我的代码结构如下

@Repository
public interface ProductRepository extends PagingAndSortingRepository<Product, Long> {
  Optional<Page<Product>> findProductByMerchantId(Long id, Pageable pageable);
}
@Service
@RequiredArgsConstructor
public class ProductServiceImpl implements ProductService {

  private final ProductRepository repository;

  public List<Product> getAllProducts(
      Long merchantId, Integer pageNo, Integer pageSize, String sortBy) {
    Pageable paging = PageRequest.of(pageNo, pageSize, Sort.by(sortBy));

    Page<Product> pagedResult =
        repository
            .findProductByMerchantId(merchantId, paging)
            .orElseThrow(
                () ->
                    new IllegalStateException(
                        String.format("There is no product belong to %s ", merchantId.toString())));

    return pagedResult.getContent();
  }

  public Product saveProduct(Product product) {

    repository.save(product);

    return product;
  }
}


@ExtendWith(MockitoExtension.class)
class ProductServiceImplTest {

    @Mock
    ProductRepository productRepository;

    @InjectMocks
    ProductServiceImpl productServiceImpl;


    @Test
    void testGetAllProducts() {

        Product product=new Product();
        List<Product> list=new ArrayList<Product>();
        list.add(product);


        Pageable paging = PageRequest.of(0, 2, Sort.by("inventory"));

        when(productServiceImpl.getAllProducts(2L,0,2,"inventory")).thenReturn(list);

      // when(productRepository.findProductByMerchantId(2L,paging)).thenReturn(list);

        productServiceImpl.getAllProducts(2L,0,2,"inventory");

        verify(productRepository).findProductByMerchantId(2L,paging);
    }

    @Test
    void testSaveProduct() {
        Product product=new Product();

        when(productServiceImpl.saveProduct(product)).thenReturn(product);

        Product product1=productServiceImpl.saveProduct(product);

        assertNotNull(product1);

        verify(productRepository,times(1)).save(product);
    }
}

【问题讨论】:

    标签: java spring spring-boot unit-testing pagination


    【解决方案1】:

    你的方法是正确的,你必须像你一样模拟存储库接口并模拟调用。

    如果您的存储库方法返回列表,则使用如下

     Mockito.when(appRepoitory.findProductByMerchantId(Mockito.anyString(), Mockito.any())).thenReturn(new ArrayList<>());
    

    如果您的存储库方法返回 Page 则如下所示。

    Page<Product> pro= Mockito.mock(Page.class);
        Mockito.when(appRepoitory.findProductByMerchantId(Mockito.anyString(), Mockito.any())).thenReturn(pro);
    

    并验证您的班级中有这些注释。

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.mockito.InjectMocks;
    import org.mockito.Mock;
    import org.mockito.Mockito;
    import org.mockito.junit.MockitoJUnitRunner;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.domain.Page;
    
        @SpringBootTest
        @RunWith(MockitoJUnitRunner.class)
        public class ServiceTest {
        
        }
    

    【讨论】:

    • 感谢您的回答先生。但它在 thenReturn(list) 部分给了我错误,说无法解析方法'thenReturn(java.util.List)'。我不明白为什么
    • 请立即查看以上答案
    • 抱歉,我还有最后一个问题。您的答案中提到的规则也适用于可选?因为我的存储库返回 Optional。
    • 如果您在存储库中有可选项,请执行以下操作
    • thenReturn(Optional.empty())
    猜你喜欢
    • 2019-01-14
    • 2016-11-30
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2017-08-08
    相关资源
    最近更新 更多