Android-импорт никогда не должен существовать в Presenter, если вы хотите, чтобы он тестировался на модуле.
Что вы можете сделать, сделать слой абстракции выше SharedPreferences
давайте назовем его Cache
, это будетбудь интерфейсом со всеми необходимыми методами кеширования, вы бы обеспечили его конкретную реализацию, используя SharedPreferences
.
Вот краткая иллюстрация идеи:
interface Cache {
// Your caching methods
}
class CacheImpl implements Cache {
private SharedPreferences sharedPrefs;
public CacheImpl(Context context) {
// Takes a context to init sharedPrefs.
}
// implements all of Cache's methods
}
Тогда выпередаст ссылку для этой реализации в конструктор Presenter (еще лучше, используя DI для внедрения его в конструктор Presenters):
Cache cache = new CacheImpl(myContext); // Naturally that would be an activity context
MyPresenter presenter = new MyPresenter(cache);
Затем в презентаторе вы получите этот экземпляр в конструкторе:
private Cache cache;
public MyPresenter(Cache cache) {
this.cache = cache;
}
Затем вы можете использовать переменную кэша, не зная о ее конкретной реализации, и при этом не следует предоставлять ей контекст.