How to check ORM in android correctly using Mockito?

I am new to testing Mockito on Android and have problems understanding how to test data source methods. I use RushOrm, which is initialized in the Application class of the application:

AndroidInitializeConfig config = new AndroidInitializeConfig(getApplicationContext());
List<Class<? extends Rush>> classes = new ArrayList<>();
classes.add(CardCollection.class);
classes.add(Note.class);
config.setClasses(classes);
RushCore.initialize(config);

My datasource class:

public class CollectionsRepository implements CollectionDataSource {

    private static CollectionsRepository INSTANCE = null;
    private final CollectionDataSource dataSource;

    // Prevent direct instantiation.
    private CollectionsRepository(@NonNull CollectionDataSource dataSource) {
        this.dataSource = checkNotNull(dataSource);
    }

    public static CollectionsRepository getInstance(CollectionDataSource dataSource) {
        if (INSTANCE == null) {
            INSTANCE = new CollectionsRepository(dataSource);
        }
        return INSTANCE;
    }

    @Override
    public void getCollections(@NonNull LoadCollectionsCallback callback) {
        dataSource.getCollections(callback);
    }

    @Override
    public void getCollection(@NonNull String collectionId, @NonNull GetCollectionCallback callback) {
        dataSource.getCollection(collectionId, callback);
    }

    @Override
    public void saveCollection(@NonNull CardCollection cardCollection, @NonNull final SaveOrUpdateCollectionCallback callback) {
        dataSource.saveCollection(cardCollection, callback);
    }

    @Override
    public void updateCollection(@NonNull CardCollection cardCollection, @NonNull SaveOrUpdateCollectionCallback callback) {
        dataSource.updateCollection(cardCollection, callback);
    }

    @Override
    public void deleteCollection(@NonNull CardCollection cardCollection) {
        dataSource.deleteCollection(cardCollection);
    }

    @Override
    public void deleteAllCollections(@NonNull RushCallback callback) {
        dataSource.deleteAllCollections(callback);
    }
}

This is my test class for the repository class:

@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP, application = ProjectApplication.class)
@RunWith(MockitoJUnitRunner.class)
public class CollectionsRepositoryTest {

    private CollectionPresenter presenter;

    @Mock
    private CollectionsRepository repository;

    @Mock
    private CollectionContract.View view;

    @Mock
    private CollectionDataSourceImplementation dataSource;

    @Mock
    private CollectionDataSource.GetCollectionCallback getCollectionCallback;
    @Mock
    private CollectionDataSource.LoadCollectionsCallback loadCollectionsCallback;
    @Mock
    private CollectionDataSource.SaveOrUpdateCollectionCallback saveOrUpdateCollectionCallback;

    @Captor
    private ArgumentCaptor<CollectionDataSource.GetCollectionCallback> getCollectionCallbackArgumentCaptor;
    @Captor
    private ArgumentCaptor<CollectionDataSource.LoadCollectionsCallback> loadCollectionsCallbackArgumentCaptor;
    @Captor
    private ArgumentCaptor<CollectionDataSource.SaveOrUpdateCollectionCallback> saveOrUpdateCollectionCallbackArgumentCaptor;

    private static List<CardCollection> collections = Lists.newArrayList(new CardCollection("Title1", "Description1", null),
            new CardCollection("Title2", "Description2", null));
    private final static String collection_title = "title";

    @Before
    public void setUp() {
        // Mockito has a very convenient way to inject mocks by using the @Mock annotation. To
        // inject the mocks in the test the initMocks method needs to be called.
        MockitoAnnotations.initMocks(this);

        // Get a reference to the class under test
        presenter = new CollectionPresenter(repository, view);
    }

    @Test
    public void getCollections() {
        dataSource.getCollections(loadCollectionsCallback);
        verify(dataSource).getCollections(loadCollectionsCallbackArgumentCaptor.capture());
        loadCollectionsCallbackArgumentCaptor.getValue().onSuccess(collections);
    }

    @Test
    public void getCollection() {
        dataSource.getCollection(collection_title, getCollectionCallback);
        verify(dataSource).getCollection(eq(collection_title), any(CollectionDataSourceImplementation.GetCollectionCallback.class));
    }

    @Test
    public void saveCollection() {
        CardCollection collection = new CardCollection("Title", "Description", null);
        dataSource.saveCollection(collection, saveOrUpdateCollectionCallback);
        verify(dataSource).saveCollection(collection, saveOrUpdateCollectionCallbackArgumentCaptor.capture());

        saveOrUpdateCollectionCallbackArgumentCaptor.getValue().onSuccess(collection);
    }

    @Test
    public void updateCollection() {

    }

    @Test
    public void deleteCollection() {

    }

    @Test
    public void deleteAllCollections() {

    }
}

The saveCollection method does not work. I am googling and basically find how to test a direct sqlite connection. Any ideas would be helpful. Thank.

+4
source share
2 answers

It looks like you are mistaken when testing the device:

What do your methods do:

  • The test method calls the mocked object method
  • "",

: . , mocked ; - . , , , , , .

: , , (, , ).

unit test , . : , , , , , .

, " ", , . unit test ( !)

+3

, :

verify(dataSource).saveCollection(collection, saveOrUpdateCollectionCallbackArgumentCaptor.capture());

:

verify(dataSource).saveCollection(collection, saveOrUpdateCollectionCallback);

.

+1

Source: https://habr.com/ru/post/1667632/


All Articles