Установите пользовательский контекст в AndroidTestCase

Я пытаюсь протестировать свой собственный ContentProvider, который обновляет элемент только в определенный момент времени.

Чтобы протестировать ветку shouldUpdate, мне нужно вернуть время и установить пользовательскую дату в моем приложении. Я не мог заглушить System.currentTimeMillis(), поэтому я поместил метод в свой объект приложения и пытаюсь setContext() в AndroidTestCase вот так.

private void setContextDate(final Date myCustomDate){
    final Context baseContext = getContext();
    final ContentResolver contentResolver = baseContext.getContentResolver();
    final MyApplication myApp = new MyApplication() {
        @Override
        public long currentTimeMillis(){
            return myCustomDate.getTime();
            // This normally returns System.currentTimeMillis();
        }
        @Override
        public Context getBaseContext(){
            return baseContext;
        }
        @Override
        public ContentResolver getContentResolver(){
            return contentResolver;
        }
    };
    ContextWrapper contextWrapper = new ContextWrapper(baseContext) {
        @Override
        public Context getApplicationContext(){
            return myApp;
        }

    };
    setContext(contextWrapper);

}

Однако, когда я вызываю getApplicationContext().currentTimeMillis() в своем провайдере, он возвращает реальную реализацию метода, то есть System.currentTimeMillis(), а не мою пользовательскую дату и время, которое я установил в файле AndroidTestCase.

Что я делаю неправильно?

p.s. Я знаю о ProviderTestCase2, но я также обращаюсь к SharedPreferences в своем провайдере, и для них ProviderTestCase2 возвращает значение null. Вот почему я использую AndroidTestCase.


comment
Я заметил очевидную задержку перед тем, как AndroidTestCase установит базовый контекст приложения (см. ссылку). Эта задержка может привести к инициализации AndroidTestCase. его контекст после того, как вы установите свой.   -  person cdhabecker    schedule 19.07.2011
comment
@cdhabecker Я вызываю setContextDate() в setUp() и после этого проверяю, возвращает ли он правильный контекст приложения, что он и делает. Только когда он запускает фактический тест, он возвращает другой контекст приложения, который не переопределяется.   -  person siamii    schedule 19.07.2011
comment
Меняется контекст между setup() и test()? Фу. Похоже, другая проблема, чем у меня была. Удачи.   -  person cdhabecker    schedule 19.07.2011