繁体   English   中英

如何在 Spring Boot 中测试分页结果?

[英]How can i test paginated result in spring boot?

我是编写单元测试的新手。 我尝试了一些东西并且 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);
    }
}

您的方法是正确的,您必须模拟 Repository 接口并像您一样模拟调用。

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

 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 {
    
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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