'Getting "Wanted but not invoked" when running unit test

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)



Solution 1:[1]

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.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Rob Spoor