Sign in Go Pro

Android Clean Architecture

Testing the projects data repository

This lesson is for PRO members.

Upgrade today to get access to all the PRO lessons.

Unlock this lesson
Autoplay

Up next

Previous

About

The projects data repository is used to orchestrate the flow of data between the domain module and the remote / cache modules. In this lesson, we're going to be writing tests to ensure that the functions in this class remain functional over time.

Instructor

Links

Comments

Hi,

When I try to run the bookmarkProjectCompletes() test, I'm getting a null pointer exception at this string:

val testObserver = repository.bookmarkProject(DataFactory.randomString()).test()

What could be the problem?

Thanks!

Would you be able to double check the cache.setProjectAsBookmarked is being stubbed? That is a possibility as to why a NPE is being thrown here.

If you have setup the DataFactory to return a String, then it might be worth checking in the test class if you have initialised the repository correctly.

I experience the same problem.

Would you be able to double check the cache.setProjectAsBookmarked is being stubbed? That is a possibility as to why a NPE is being thrown here.

NPE appears because of repository.bookmarkProject() returns null.
In bookmarkProject() method we use factory.getCacheDataStore and it returns store, not cache.
But in stubBookmarkProject() we stub cache.

So if we change stubBookmarkProject() in the way we stub store:
whenever(store.setProjectAsBookmarked(any()))
.thenReturn(completable)

it'll work as expected.

Joe, please check is this approach right.

I believe you are correct, but I would like to hear Joe's response. I find this implementation of the ProjectsCache class to be difficult to understand. The ProjectsDataStoreFactory picks the appropriate store, either the CacheDataStore or the RemoteDataStore for us, and the CacheDataStore has it's own ProjectsCache object built into it and even implements the setProjectAsBookmarked in the DataStore. I assume we pass a Cache object because we need to check the cache to determine what data store we're going to use, so at that point we haven't picked a dataStore yet, but I'm a bit confused as to why both the ProjectsCache and the ProjectCacheDataStore both implement setProjectAsBookmarked(). His unit test confuses me even more.

Hey Steve,

sorry that this isn't made clearer - it is true that this might be an over abstraction in some cases, the ProjectsDataStore classes are Data layer classes that manage the fetch and massaging of any data at this level - because the ProjectsDataStore interface may also define functions which that data store implementation doesn't support. For example, such as the remote layer not supporting the bookmark a project) we can handle this not being supported an isolation of the data layer rather than giving the remote layer a function that it doesn't need to (or shouldn't even) support. As mentioned in the course this is completely optional to have this extra layer of abstraction - you could ditch this internal interface and have the cache / remote layer implementations implement ProjectsDataStore directly. Personally that is what I do within my own projects, but wanted to offer the example here for those that might need that level of abstraction

After looking more closely at the ProjectsDataRepository class I think you're right and Joe's unit test code wrong. In the PDR it specifically calls the CacheDataStore method and not the ProjectsCache method. But what do I know, I'm a newb,

Worked well for me. I've changed cache to store variable in stubBookmarkProject and stubUnBookmarkProject.

>
You need to go PRO to post comments.

Lessons in Android Clean Architecture

Introduction to Clean Architecture
03:40
Joe Birch
GDE
Android and Clean Architecture
03:51
Joe Birch
GDE
Setting up a Multi-Module project
02:24
Joe Birch
GDE
Setting up the Domain layer module
02:24
Joe Birch
GDE
Creating the abstraction for our RxJava Observation Thread
02:02
Joe Birch
GDE
Setting up the Business Data for the Domain Layer
01:47
Joe Birch
GDE
Setting up the data access interface for the Domain Layer
01:49
Joe Birch
GDE
Setting up the Domain Layer Interactor classes
Pro
03:28
Joe Birch
GDE
Implementing the Get Projects use case
Pro
01:49
Joe Birch
GDE
Implementing the get Bookmarked Projects use case
Pro
01:33
Joe Birch
GDE
Implementing the Bookmark Project use case
Pro
01:57
Joe Birch
GDE
Implementing the UnBookmark Project use case (Domain layer 8)
Pro
02:03
Joe Birch
GDE
Testing the Get Projects use case
Pro
02:41
Joe Birch
GDE
Testing the Get Bookmarked Projects use case
Pro
02:04
Joe Birch
GDE
Testing the Bookmark Project use case
Pro
02:10
Joe Birch
GDE
Testing the UnBookmark Project use case
Pro
02:06
Joe Birch
GDE
Setting up the data module
Pro
02:17
Joe Birch
GDE
Creating the data models for the data layer
Pro
02:48
Joe Birch
GDE
Creating the external source interfaces for our data layer
Pro
02:24
Joe Birch
GDE
Creating the data layer store interface
Pro
01:19
Joe Birch
GDE
Creating the data layer cache data store
Pro
01:21
Joe Birch
GDE
Creating the data layer remote data store
Pro
01:39
Joe Birch
GDE
Creating the data store factory class
Pro
01:24
Joe Birch
GDE
Creating the central access point for the data layer
Pro
03:00
Joe Birch
GDE
Setting up the tests for the Data Layer
Pro
00:46
Joe Birch
GDE
Testing the data store factory class
Pro
01:39
Joe Birch
GDE
Testing the project entity mapper
Pro
01:18
Joe Birch
GDE
Testing the projects data repository
Pro
06:02
Joe Birch
GDE
Testing the projects cache data store
Pro
06:30
Joe Birch
GDE
Testing the projects remote data store
Pro
02:17
Joe Birch
GDE
Setting up the remote module
Pro
02:21
Joe Birch
GDE
Creating the data models for the remote layer
Pro
02:06
Joe Birch
GDE
Creating the Retrofit Service for the remote data source
Pro
01:58
Joe Birch
GDE
Creating the Retrofit Service Factory for the remote service interface
Pro
02:52
Joe Birch
GDE
Creating the data model mapper for the Remote Layer
Pro
01:59
Joe Birch
GDE
Creating the Remote Source implementation
Pro
01:55
Joe Birch
GDE
Setting up the Remote layer for testing
Pro
02:13
Joe Birch
GDE
Testing the remote model mapper class
Pro
01:39
Joe Birch
GDE
Testing the remote source implementation
Pro
05:09
Joe Birch
GDE
Setting up the Cache module
Pro
02:45
Joe Birch
GDE
Setting up the Cache layer data models
Pro
02:02
Joe Birch
GDE
Creating the database for the cache layer
Pro
01:34
Joe Birch
GDE
Creating the cached project Data Access Object
Pro
02:42
Joe Birch
GDE
Creating the Configuration Data Access Object
Pro
02:07
Joe Birch
GDE
Creating the cache model mapper
Pro
02:06
Joe Birch
GDE
Creating the Projects Cache data source Implementation
Pro
03:57
Joe Birch
GDE
Setting up the tests for our cache layer
Pro
01:17
Joe Birch
GDE
Testing the cached project model mapper
Pro
01:44
Joe Birch
GDE
Testing the Cached project DAO
Pro
04:33
Joe Birch
GDE
Testing the Configuration DAO
Pro
02:05
Joe Birch
GDE
Testing the projects cache implementation
Pro
05:48
Joe Birch
GDE
Setting up the presentation module
Pro
02:05
Joe Birch
GDE
Creating the data models for the presentation layer
Pro
01:13
Joe Birch
GDE
Creating the data model mapper for the presentation layer
Pro
01:26
Joe Birch
GDE
Creating the presentation state model
Pro
01:39
Joe Birch
GDE
Creating the browse projects view model
Pro
04:25
Joe Birch
GDE
Creating the bookmarked projects view model
Pro
03:05
Joe Birch
GDE
Setting up the presentation module tests
Pro
02:09
Joe Birch
GDE
Testing the view model mapper
Pro
01:17
Joe Birch
GDE
Testing our Browse Projects View Model implementation
Pro
04:36
Joe Birch
GDE
Testing our Browse Bookmarked Projects View Model implementation
Pro
04:34
Joe Birch
GDE
Setting up the UI module
Pro
02:22
Joe Birch
GDE
Creating the Post Execution Thread Implementation
Pro
01:26
Joe Birch
GDE
Setting up the application class
Pro
00:50
Joe Birch
GDE
Setting up the Dependency Injection for the UI module
Pro
02:46
Joe Birch
GDE
Creating the UI modules Project representation
Pro
00:50
Joe Birch
GDE
Creating the the Project model mapper for the UI module
Pro
01:24
Joe Birch
GDE
Setting up the Browse Projects Activity
Pro
01:08
Joe Birch
GDE
Configuring the DI for the project
Pro
04:37
Joe Birch
GDE
Creating the Project item view
Pro
01:51
Joe Birch
GDE
Creating the Browse Projects Adapter
Pro
03:27
Joe Birch
GDE
Creating the browse bookmarked projects adapter
Pro
03:54
Joe Birch
GDE
Creating the browse bookmarked projects activity
Pro
03:18
Joe Birch
GDE
Tying together the browse projects and bookmarked projects activity
Pro
02:30
Joe Birch
GDE
Setting up Unit Tests for the UI module
Pro
00:54
Joe Birch
GDE
Test the project model mapper
Pro
01:10
Joe Birch
GDE
Configuring the Dependency Injection for our User Interface tests
Pro
06:10
Joe Birch
GDE
Writing Espresso tests for the Browse Projects Activity
Pro
03:15
Joe Birch
GDE
Writing Espresso tests for the Bookmarked Projects Activity
Pro
02:34
Joe Birch
GDE
Simplifying the work we have done
Pro
05:14
Joe Birch
GDE