如何正确创建 JUnit 测试方法来测试需要 Pageable 对象进行分页的服务方法?

问题描述 投票:0回答:3

我有这个服务方法,必须使用 JUnit 进行测试:

@Override
public Page<WalletDTO> getWalletListByWalletTypes(List<String> walletTypesIds, Pageable pageable) throws NotFoundException {

    if(walletTypesIds == null) {
        Page<Wallet> walletsDTOList = this.walletRepository.findAll(pageable);
        return walletsDTOList.map(m -> conversionService.convert(m, WalletDTO.class));
    }
    List<WalletType> walletsTypesEntity = new ArrayList<>();
    for(String wt : walletTypesIds){
        //WalletType wtEntity = this.walletTypeRepository.findByName(wt);
        WalletType wtEntity = this.walletTypeRepository.findById(Integer.parseInt(wt)).get();
        if(wtEntity == null) throw new NotFoundException("WalletType not found: " + wt);
        walletsTypesEntity.add(wtEntity);
    }

    
    Page<Wallet> walletsDTOList = this.walletRepository.findByWalletTypeIn(walletsTypesEntity,pageable);
    return walletsDTOList.map(m -> conversionService.convert(m, WalletDTO.class));
    
}

如您所见,它采用 Pageable pageable 对象作为输入参数来对结果进行分页。

然后我创建了一个像这样的 JUnit 测试方法:

@Test
@Order(2)
public void getWalletListByWalletTypesTest() throws NotFoundException {
    
    List<String> singleItemList = Arrays.asList("1");
    List<String> multiItemsList = Arrays.asList("1", "2", "3");
    
    Page<WalletDTO> walletsType1DTOList =  this.walletService.getWalletListByWalletTypes(singleItemList, null);
    Page<WalletDTO> walletsAlltypesDTOList =  this.walletService.getWalletListByWalletTypes(multiItemsList, null);
    
    
    assertTrue(walletsType1DTOList.getNumberOfElements() > 0, "Exist at least one wallet");
    assertTrue(walletsAlltypesDTOList.getNumberOfElements() > 0, "Exist at least one wallet");
    assertTrue(walletsAlltypesDTOList.getNumberOfElements() < walletsType1DTOList.getNumberOfElements(), 
               "The wallets belonging to all the wallets types are > then the wallet belonging to a single wallet type");
    
}

但它不起作用,因为当它调用要测试的 getWalletListByWalletTypes() 方法时,它传递的是 null 而不是传递此 Pageable 参数。因此,当执行该方法时,当执行这行代码(当它调用存储库方法从数据库检索数据时)时,它会抛出异常:

Page<Wallet> walletsDTOList = this.walletRepository.findByWalletTypeIn(walletsTypesEntity,pageable);

在我看来,我无法创建一个 Pageable 对象,或者我不明白如何创建。

正确测试这样的方法的方法是什么?

java spring spring-boot junit spring-data
3个回答
0
投票

有两种方法。通常,为了进行单元测试,我们使用模拟对象(Junit+Mockito lib),因为单元测试是行为测试。因此第一种方法只是模拟 Pageable 类:

final Pageable sourcePageable = mock(Pageable.class);

并通过“when/then”获取尺寸和页数:

when(sourcePageable.getPageNumber()).thenReturn(1);
when(sourcePageable.getPageSize()).thenReturn(20);

上面 Dirk Deyne 所说的第二种方法是创建一个实现

Pageable
接口的类型(例如
PageRequest

您将使用其中哪一个取决于您。


0
投票

对于单元测试,您可以模拟超出测试范围的依赖项。

我猜 Java 中这项工作最流行的框架是 Mockito

只需使用

import static org.mockito.Mockito.*;
import org.springframework.data.domain.Pageable;

import org.junit.jupiter.api.Test

class MyTest {
  
  @Test
  void testMock() {
    var pageableMock = mock(Pageable.class);
    ....
  }
}

如果您使用了模拟的返回值,您甚至可以模拟

Pageable
方法。

when(pageableMock.getPageNumber()).thenReturn(1);
when(pageableMock.getPageSize()).thenReturn(DEFAULT_PAGE_SIZE);

0
投票

像这样初始化分页: private val 可分页: Pageable = PageRequest.of(0, 10)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.