Home > Mobile >  Getting "Wanted but not invoked" when running unit test
Getting "Wanted but not invoked" when running unit test

Time:04-04

Trying to test repository method, but my test fails with following "Wanted but not invoked: cellphonesDao.deleteAllCellphones();" Here is repo method:

@Override
    public Single<Cellphone[]> getCellphones() {
        Single<CellPhoneEntity[]> remoteCellphones =
            networkModule.productApi()
                .getCellPhones()
                .onErrorResumeNext(cellphonesDao.getAllCellphones()); // todo return value if true
        Single<CellPhoneEntity[]> localCellphones = cellphonesDao.getAllCellphones();

        return Single.zip(remoteCellphones, localCellphones, (remote, local) -> {
            if (!Arrays.equals(remote, local)) {
                cellphonesDao.deleteAllCellphones();
                for (CellPhoneEntity cellPhoneEntity : remote) {
                    cellphonesDao.insertCellphone(cellPhoneEntity);
                }
            }

            return mapper.toCellphones(remote);
        });
    }

Main porpuse is to test repo method in correct way. Guess the way I chose is not good. Here is test implementation:

class CellPhoneRepositoryImplTest {
    NetworkModule networkModule;
    CellphonesDao cellphonesDao;
    CellphoneMapper cellphoneMapper;
    CellPhoneRepositoryImpl cellPhoneRepository;
    ProductAPI productAPI;

    @BeforeEach
    void setUp() {
        networkModule = Mockito.mock(NetworkModule.class);
        cellphonesDao = Mockito.mock(CellphonesDao.class);
        productAPI = Mockito.mock(ProductAPI.class);
        cellphoneMapper = new CellphoneMapper();
        cellPhoneRepository = Mockito.spy(new CellPhoneRepositoryImpl(
            networkModule,
            cellphonesDao,
            cellphoneMapper
        ));
    }

    @Test
    void whenRemoteDataAreDifferentFromLocalDbIsUpdated() {
        int numberOfCellphones = 5;
        CellPhoneEntity[] remoteCellphones = DummyCellphoneEntityFactory.generateCellphones(numberOfCellphones);
        CellPhoneEntity[] localCellphones = DummyCellphoneEntityFactory.generateCellphones(numberOfCellphones);

        Mockito.when(networkModule.productApi()).thenReturn(productAPI);
        Mockito.when(networkModule.productApi().getCellPhones()).thenReturn(wrapWithSingle(remoteCellphones));
//        Mockito.when(networkModule.productApi().getCellPhones().onErrorResumeNext(cellphonesDao.getAllCellphones())).thenReturn(wrapWithSingle(remoteCellphones));
        Mockito.when(cellphonesDao.getAllCellphones()).thenReturn(wrapWithSingle(localCellphones));

        Mockito.doNothing().when(cellphonesDao).deleteAllCellphones();

        cellPhoneRepository.getCellphones();
        Mockito.verify(cellphonesDao, Mockito.times(1))
            .deleteAllCellphones();
    }

    private Single<CellPhoneEntity[]> wrapWithSingle(CellPhoneEntity[] cellphones) {
        return Single.just(cellphones);
    }
}

I will be glad for any suggestion)

CodePudding user response:

The code inside the returned Single isn't executed immediately, but your verifications are. Try calling cellPhoneRepository.getCellphones().blockingGet() instead of just cellPhoneRepository.getCellphones(). The blockingGet() should make your test wait until the Single is done executing.

  • Related