Инъекционный состав по инструментальному тесту с зубочисткой - PullRequest
0 голосов
/ 25 мая 2018

У меня есть инструментальный тест Android с использованием Зубочистка DI :

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {

    private static final String LOG_TAG = ExampleInstrumentedTest.class.getName();

    @Inject
    Context mContext;

    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertThat(appContext.getPackageName(), startsWith("com.honeybeeapp.toothpicktest.mytoothpickapplication"));

        final SimpleApp application = (SimpleApp) appContext.getApplicationContext();
        Scope scope = Toothpick.openScopes(application, this);

        Module module = new Module();
                    module.bind(Context.class).toInstance(application);
        scope.installTestModules(module);
        Toothpick.inject(this, scope);

        assertTrue(mContext != null); // FAILS :(

        Log.d(LOG_TAG, "Injected");
    }
}

( Файл в Полный репо ).

Остальная часть приложения работает, и инъекция в мою активность, службы и фрагменты работает нормально.

Когда я вызываю Toothpick.inject(otherThing, scope); для экземпляра другого класса в инструментальном тесте, эта инъекция работает нормально.

Я подозреваю, что класс Tests (или приложение?) Непо какой-то причине правильно найти декорированных @Inject членов.

Я попробовал scope.installModules(module);, и это тоже не работает.

Некоторые фрагменты моего файла gradle:

android {
    compileSdkVersion 27
    flavorDimensions "default"
    defaultConfig {
        applicationId "com.honeybeeapp.toothpicktest.mytoothpickapplication"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [
                        'toothpick_registry_package_name': 'com.honeybeeapp.toothpicktest.mytoothpickapplication',
                ]
            }
        }
    }
    snip...

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.android.support:appcompat-v7:27.1.1'
        implementation 'com.android.support.constraint:constraint-layout:1.1.0'

        implementation 'com.android.support:support-v4:27.1.1'
        compile 'com.github.stephanenicolas.toothpick:toothpick-runtime:1.1.3'
        compile 'com.github.stephanenicolas.toothpick:smoothie:1.1.3'
        annotationProcessor 'com.github.stephanenicolas.toothpick:toothpick-compiler:1.1.3'

        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

        testCompile 'com.github.stephanenicolas.toothpick:toothpick-testing:1.1.3'
    }

Полный Gradle Файл .

1 Ответ

0 голосов
/ 30 мая 2018

Глядя на подобную проблему в dagger2 Я вижу, что они просто должны были явно добавить процессор аннотаций для тестов.То же самое можно сделать и с Toothpick!

В мой файл Gradle добавлено следующее:

    dependencies {
        ...
        androidTestAnnotationProcessor 'com.github.stephanenicolas.toothpick:toothpick-compiler:1.1.3'
        ...
    }

Исправлена ​​проблема, и мои тесты прошли!

...