我有这个服务方法,必须使用 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 对象,或者我不明白如何创建。
正确测试这样的方法的方法是什么?
有两种方法。通常,为了进行单元测试,我们使用模拟对象(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
)
您将使用其中哪一个取决于您。
对于单元测试,您可以模拟超出测试范围的依赖项。
我猜 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);
像这样初始化分页: private val 可分页: Pageable = PageRequest.of(0, 10)